寻找图片中数字的轮廓并裁剪 扣取数字

本次数字图片来自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)

显示效果:

  

原文地址:https://www.cnblogs.com/carlber/p/9822524.html