OCR识别之图像预处理
生活随笔
收集整理的這篇文章主要介紹了
OCR识别之图像预处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OCR識別之圖像預處理
- 圖像預處理之作用及效果
- 圖像預處理之操作
- 圖像預處理之源代碼
圖像預處理之作用及效果
無論是使用圖像來做識別還是別的操作,都需要對圖像做一定的預處理操作,預處理的作用是方便后續我們對圖像的識別,分類等操作。對于OCR識別來說要達到的效果如下圖:
原始輸入圖像:
預處理之后的圖像:
圖像預處理之操作
以本實例的圖像來說,首先需要找到內部白色紙片的邊界,通過邊界找到它的輪廓信息。根據其輪廓信息,應用Opencv中的輪廓近似得到大致的矩形區域,然后通過計算得到該矩形區域的寬高和四個頂點的坐標。然后將該矩形區域,直接通過變換轉成(寬,高)的圖像。
圖像預處理之源代碼
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img_gauss_blur = cv2.GaussianBlur(img_gray,(5,5),0) img_canny = cv2.Canny(img_gray,34,158) #以上代碼,查找邊界#根據查找到的邊界信息,找到其輪廓信息 contours,h = cv2.findContours(img_canny,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)#根據具體的實例,在眾多輪廓中找到周長最大的前幾個 length = [] for i,contour in enumerate(contours):length.append(cv2.arcLength(contour,True)) index = np.argmax(length)#對找到的周長最大的幾個輪廓進行排序 def s(con):return cv2.arcLength(con,True) cnts = sorted(contours,key = s,reverse=True)[:1]#找到輪廓近似 long = cv2.arcLength(cnts[0],True) approx = cv2.approxPolyDP(cnts[0],0.1*long,True)res = cv2.drawContours(img.copy(),[approx],-1,(0,0,255),2)#通過近似輪廓找到四個頂點 tr = approx[0][0] br = approx[1][0] bl = approx[2][0] tl = approx[3][0]#通過四個頂點計算相應的寬度和高度 widthr = int(np.sqrt((br[0]-tr[0])**2+(br[1]-tr[1])**2)) widthl = int(np.sqrt((bl[0]-tl[0])**2+(bl[1]-tl[1])**2)) width = np.max((widthr,widthl))heightb = int(np.sqrt((br[0]-bl[0])**2+(br[1]-bl[1])**2)) heightt = int(np.sqrt((tr[0]-tl[0])**2+(tr[1]-tl[1])**2)) height = np.max((heightb,heightt))#原始的矩形點,變換后的點 old_point = np.array([tl.tolist(),tr.tolist(),br.tolist(),bl.tolist()],np.float32) new_point = np.array([[0,height-1],[0,0],[width-1,0],[width-1,height-1]],np.float32)#得到轉換矩陣 M = cv2.getPerspectiveTransform(old_point,new_point)#得到轉換后的圖像 new_image = cv2.warpPerspective(img,M,(width-1,height-1))總結
以上是生活随笔為你收集整理的OCR识别之图像预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stringstream用法总结
- 下一篇: HTTPS 建立连接的详细过程