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

Posted carlber

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找图片中数字的轮廓并裁剪 扣取数字相关的知识,希望对你有一定的参考价值。

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

 

显示效果:

  技术分享图片

 


以上是关于寻找图片中数字的轮廓并裁剪 扣取数字的主要内容,如果未能解决你的问题,请参考以下文章

opencv练手项目:信用卡数字识别

在 ASP.NET 中以前制作但复杂的形状上裁剪图片

opencv实战——复杂背景下寻找物体轮廓(底帽)

机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.c

如何从 RCNN 中裁剪分割的对象?

使用 jQuery 裁剪图片 [关闭]