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


本次數字圖片來自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)

 

顯示效果:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM