網(wǎng)站制作什么樣的字體好看什么是seo推廣
目錄
一、項(xiàng)目實(shí)施
1、自定義函數(shù)
2、定位模版圖像中的數(shù)字
1)模版圖二值化處理
運(yùn)行結(jié)果:
2)展示所有數(shù)字
?運(yùn)行結(jié)果:
3、識別身份證號
1)灰度圖、二值化圖展示
運(yùn)行結(jié)果
2)定位身份證號每一個(gè)數(shù)字
運(yùn)行結(jié)果:
3)取出身份證號每一個(gè)數(shù)字
運(yùn)行結(jié)果:
4)使用模板匹配計(jì)算匹配得分
運(yùn)行結(jié)果:
二、總結(jié)
1、關(guān)于圖像識別
2、在圖像識別任務(wù)中,通常包括以下幾個(gè)步驟:
3、應(yīng)用領(lǐng)域
一、項(xiàng)目實(shí)施
1、自定義函數(shù)
????????用于展示圖像以及獲取輸入的輪廓圖像的排序結(jié)果和邊界信息
def cv_show(name, image): # 輸入兩個(gè)參數(shù),圖像名和圖像地址即可展示圖像cv2.imshow(name, image)cv2.waitKey(0)import cv2
def sort_contours(cnts ,method='left-to-right'): # 輸入?yún)?shù)輪廓列表,以及method,默認(rèn)排序方式為由左到右reverse = False # 布爾值,用于控制排序的方向i = 0if method == 'right-to-left' or method == 'bottom-to-top': # 判斷排序方式,以此來更改reversereverse=Trueif method == 'top-to-bottom' or method == 'bottom-to-top':i = 1boundingBoxes = [cv2.boundingRect(c) for c in cnts] # 遍歷每一個(gè)輪廓圖,取出輪廓圖的x、y、w、h,將這些信息存放到空列表中# 將列表輪廓和輪廓信息組合成一個(gè)元組的列表,再通過匿名函數(shù)排序這個(gè)元組列表,排序依據(jù)為輪廓數(shù)據(jù)的第一位x大小,降序方式,返回兩個(gè)元素,一個(gè)是排序后的輪廓列表,一個(gè)是輪廓的邊界框(cnts,boundingBoxes) = zip(*sorted(zip(cnts,boundingBoxes),key=lambda b:b[1][i],reverse=reverse))return cnts,boundingBoxes
2、定位模版圖像中的數(shù)字
????????1)模版圖二值化處理
img = cv2.imread("shuzi.png") # 導(dǎo)入模版圖像
cv_show('img', img) # 展示原圖
gray = cv2.imread("shuzi.png", 0) # 讀取模版圖的灰度圖
ref = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)[1] # 對灰度圖進(jìn)行二值化處理,灰度值大于150的將其改變?yōu)?55,小于150的改變?yōu)?
cv_show('ref', ref) # 展示二值化圖像
? ? ? ? ? ? 運(yùn)行結(jié)果:
????????2)展示所有數(shù)字
# 計(jì)算輪廓: cv2.findContours()數(shù)接受的參數(shù)為二值圖,即黑白的(不是灰度圖)
# cv2.RETR_EXTERNAL 只檢測外輪廓,cv2.CHAIN_APPRO_SIMPLE只保留端點(diǎn)坐標(biāo)
_,refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, refCnts, -1, (0, 255, 0), 2) # 繪制輪廓
cv_show('img', img)
#
refCnts = sort_contours(refCnts, method='left-to-right')[0] # 調(diào)用自定義函數(shù),對輪廓圖像進(jìn)行排序,返回排序后圖片以及輪廓的邊界信息(x,y,w,h)
# 保在模板中每個(gè)數(shù)字對應(yīng)的像素值
digits = {}
for (i, c) in enumerate(refCnts): # 使用函數(shù)enumerate返回可迭代器的索引和其對應(yīng)的值(x, y, w, h) = cv2.boundingRect(c) # 計(jì)算輪廓的外接矩形,返回矩形的邊界信息roi = ref[y - 2 : y + h + 2, x - 2 : x + w + 2] # 裁剪出每個(gè)數(shù)字對應(yīng)的圖像roi = cv2.resize(roi, (57, 88)) # 將裁剪出來的圖像進(jìn)行縮放,尺寸變成(57,88)roi = cv2.bitwise_not(roi) # 對每個(gè)數(shù)字進(jìn)行按位取反運(yùn)算,即灰度值255變成0,0變成255cv_show('roi',roi) # 展示取反后的圖像digits[i] = roi # 將每個(gè)輪廓存入字典
cv2.destroyAllWindows() # 關(guān)閉所有圖像
? ? ? ? ? ? 運(yùn)行結(jié)果:
3、識別身份證號
????????1)灰度圖、二值化圖展示
img = cv2.imread('./shenfen.jpg')
imgg=img.copy()
cv_show('img', img)gray = cv2.imread('./shenfen.jpg', 0) # 灰度圖
cv_show('gray', gray)ref = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)[1] # 二值化
cv_show('ref', ref)
? ? ? ? ? ? 運(yùn)行結(jié)果
????????2)定位身份證號每一個(gè)數(shù)字
# # 計(jì)算輪廓: cv2.findContours()數(shù)接受的參數(shù)為二值圖,即黑白的(不是灰度圖)
# # CV2.RETR_EXTERNAL 只檢測外輪廓,CV2.CHAIN_APPROX_SIMPLE只保留端點(diǎn)坐標(biāo)
_,refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 識別身份證圖片所有輪廓
a = cv2.drawContours(img.copy(), refCnts, -1, (0, 255, 0), 2) # 繪制輪廓
cv_show('img', a)
#
# cv2.destroyAllWindows()
#
# # 遍歷輪廓,找到數(shù)字部分像素區(qū)城
locs = []
for (i, c) in enumerate(refCnts): # 遍歷每一個(gè)輪廓及其對應(yīng)索引(x, y, w, h) = cv2.boundingRect(c) # 計(jì)算外接矩形邊界信息# 選擇合適的區(qū)域,根據(jù)實(shí)際任務(wù)來if (y > 330 and y < 360) and x > 220: # 判斷輪廓的坐標(biāo)位置,留下身份證號位置的信息,此處位置信息需要自己結(jié)合原圖像素值進(jìn)行判斷l(xiāng)ocs.append((x, y, w, h)) # 滿足上述條件的為身份證號每一個(gè)數(shù)字的輪廓locs = sorted(locs, key=lambda x: x[0]) # 對身份證號按照x的值進(jìn)行進(jìn)行排序
? ? ? ? ? ? 運(yùn)行結(jié)果:
????????3)取出身份證號每一個(gè)數(shù)字
import numpy as npoutput = []
for (i, (gX, gY, gW, gH)) in enumerate(locs): # 遍歷每一個(gè)數(shù)字的邊界信息及其對應(yīng)的索引groupOutput = []group = gray[gY - 2 : gY + gH + 2, gX - 2 : gX + gW + 2] # 對每個(gè)數(shù)字的輪廓適當(dāng)加一點(diǎn)邊界,gray為上述的身份證灰度圖cv_show('group',group) # 繪制邊界# 預(yù)處理group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] # 二值化每個(gè)數(shù)字的輪廓圖cv_show('group',group)roi = cv2.resize(group, (57, 88)) # 對每個(gè)數(shù)字做縮放處理cv_show('roi',roi)
????????運(yùn)行結(jié)果:
????????4)使用模板匹配計(jì)算匹配得分
scores = []# 在模板中計(jì)算每一個(gè)得分for (digit, digitROI) in digits.items(): # 遍歷每一個(gè)數(shù)字模版及其對應(yīng)的數(shù)值# 模板匹配result = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF) # 對上述識別出來的身份證號圖與數(shù)字模版進(jìn)行匹配(_, score, _, _) = cv2.minMaxLoc(result) # # 找到上述模板匹配相關(guān)系數(shù)最大值,只要score,其他返回值忽略scores.append(score) # 將最大值增加到列表# 得到最合適的數(shù)字groupOutput.append(str(np.argmax(scores))) # 取出最大值對應(yīng)的數(shù)字存入列表# 繪制每個(gè)數(shù)字的矩形邊框cv2.rectangle(imgg, (gX - 5, gY - 5), (gX + gW + 5, gY + gH + 5), (0, 0, 255), 1)# cv2.putText()是OpenCV庫中的一個(gè)函數(shù),用于在圖像上添加文本。cv2.putText(imgg, "".join(groupOutput), (gX, gY - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)output.extend(groupOutput) # 得到結(jié)果
#
# 打印結(jié)果
print("Card ID #: {}".format("".join(output)))
cv2.imshow("Image", imgg)
cv2.waitKey(0)
cv2.destroyAllWindows()
? ? ? ? ? ? 運(yùn)行結(jié)果:
二、總結(jié)
1、關(guān)于圖像識別
????????圖像識別是計(jì)算機(jī)視覺領(lǐng)域中的一個(gè)重要任務(wù),其目標(biāo)是讓計(jì)算機(jī)能夠理解和解釋圖像中的內(nèi)容以及進(jìn)行自動化的圖像分析和處理。圖像識別技術(shù)可以應(yīng)用于很多領(lǐng)域,例如人臉識別、物體檢測、車牌識別等。
2、在圖像識別任務(wù)中,通常包括以下幾個(gè)步驟:
-
數(shù)據(jù)收集:收集大量的帶有標(biāo)注的圖像數(shù)據(jù),用于模型訓(xùn)練和測試。
-
數(shù)據(jù)預(yù)處理:對收集到的圖像數(shù)據(jù)進(jìn)行預(yù)處理,例如圖像增強(qiáng)、尺寸調(diào)整、灰度化等。
-
特征提取:提取圖像中的特征信息,常用的特征提取方法包括傳統(tǒng)的基于手工設(shè)計(jì)特征的方法和基于深度學(xué)習(xí)的方法。
-
模型訓(xùn)練:使用標(biāo)注好的圖像數(shù)據(jù)和提取到的特征信息,訓(xùn)練圖像識別模型,常用的深度學(xué)習(xí)模型包括卷積神經(jīng)網(wǎng)絡(luò)(CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)等。
-
模型優(yōu)化:對訓(xùn)練好的模型進(jìn)行優(yōu)化,主要包括模型參數(shù)調(diào)整、超參數(shù)調(diào)整等。
-
模型評估:使用測試集進(jìn)行模型評估,評估指標(biāo)包括準(zhǔn)確率、召回率、精確率等。
-
預(yù)測和應(yīng)用:使用訓(xùn)練好的模型進(jìn)行圖像識別預(yù)測,并將識別結(jié)果應(yīng)用到實(shí)際場景中。
3、應(yīng)用領(lǐng)域
????????圖像識別技術(shù)的應(yīng)用非常廣泛,例如人臉識別技術(shù)可以應(yīng)用于安全領(lǐng)域、物體檢測技術(shù)可以應(yīng)用于智能交通領(lǐng)域等。隨著深度學(xué)習(xí)等技術(shù)的發(fā)展,圖像識別技術(shù)的準(zhǔn)確性和效果也有了很大的提升。但是,圖像識別任務(wù)仍然面臨著一些挑戰(zhàn)和問題,例如對于復(fù)雜的場景和模糊的圖像可能會有較低的準(zhǔn)確率,對于大規(guī)模數(shù)據(jù)的處理和模型的訓(xùn)練也需要較大的計(jì)算資源和時(shí)間。