寻找图片中数字的轮廓并裁剪 扣取数字
本次数字图片来自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)
显示效果: