1. 程式人生 > >尋找圖片中數字的輪廓並裁剪 扣取數字

尋找圖片中數字的輪廓並裁剪 扣取數字

new hierarchy font 所有 tco ets 灰度圖 shape hold

本次數字圖片來自mnist庫

大體流程是:顯示原圖片——》灰度化(主要作用是改變數據的位數)——》進行腐蝕——》進行反二值化(使其變為白字黑背景)——》尋找輪廓——》畫出輪廓——》裁剪

為什麽要灰度化呢?本來圖片就是灰度的啊?原來是有如下原因:
技術分享圖片

import cv2  #導入cv庫
import os

image_array = cv2.imread(D:/number.png)  #讀取圖片
cv2.imshow("src",image_array)   #顯示原圖片

# print(image_array.shape)

# print(image_array.size)

#
print(image_array.dtype) image_array=cv2.cvtColor(image_array,cv2.COLOR_BGR2GRAY) #把圖片轉化為灰度圖像 從cv_32轉化為cv_8u kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3)) #定義腐蝕核的大小 dilated = cv2.dilate(image_array,kernel) #進行腐蝕 cv2.imshow("Eroded Image",dilated); #顯示腐蝕後的圖像 ret, binary = cv2.threshold(dilated, 127, 255, cv2.THRESH_BINARY_INV) #
進行反二值化 image,contours,hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #尋找輪廓 cv2.imshow(imageshow,image) # **顯示返回值image,其實與輸入參數的thresh原圖沒啥區別** # print(np.size(contours)) # # print(contours[0]) # 打印出第一個輪廓的所有點的坐標, 更改此處的0,為0--(總輪廓數-1),可打印出相應輪廓所有點的坐標 # print(hierarchy) #**打印出相應輪廓之間的關系**
for i in range(0,len(contours)): #畫出輪廓 x, y, w, h = cv2.boundingRect(contours[i]) cv2.rectangle(image, (x,y), (x+w,y+h), (253,255,0), 5) cv2.imshow("finally",image) #顯示最終效果圖 newimage = image[y + 2:y + h - 2, x + 2:x + w - 2] # 先用y確定高,再用x確定寬 #裁剪輪廓 nrootdir = ("E:/cut_image/") if not os.path.isdir(nrootdir): os.makedirs(nrootdir) cv2.imwrite(nrootdir + str(i) + ".jpg", newimage) print(i) cv2.waitKey(0)

顯示效果:

  技術分享圖片

尋找圖片中數字的輪廓並裁剪 扣取數字