opencv轮廓检测后裁剪图片
本文最后更新于 2023年2月9日 凌晨
目的是提高数字在图片中的占比,先用边缘检测找到数字的轮廓,然后得到最小矩形框,再裁剪图片
效果
原始图像为完全透明背景的数字,效果如下:
处理后的图将背景变为不透明的白色,然后裁剪掉周围的空白,大小变为28X28
代码
1 |
|
函数cv2.findContours(image, mode, method[, offset])
参数
image:单通道二值图,白色是前景
mode:轮廓检索的方式:
- cv2.RETR_EXTERNAL:只检索外部轮廓
- cv2.RETR_LIST: 检测所有轮廓且不建立层次结构
- cv2.RETR_CCOMP: 检测所有轮廓,建立两级层次结构
- cv2.RETR_TREE: 检测所有轮廓,建立完整的层次结构
method:轮廓近似的方法 - cv2.CHAIN_APPROX_NONE:存储所有的轮廓点
- cv2.CHAIN_APPROX_SIMPLE:压缩水平,垂直和对角线段,只留下端点。 例如矩形轮廓可以用4个点编码。
- cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chini chain近似算法
返回值
contours:轮廓点。列表,每一个元素为一个3维数组(其形状为(n,1,2),其中n表示轮廓点个数,2表示像素点坐标),表示一个轮廓
hierarchy:轮廓间的层次关系,为三维数组,形状为(1,n,4),其中n表示轮廓总个数,4指的是用4个数表示各轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓的编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号
函数cv2.getStructuringElement(shape,ksize)
参数
shape:核的形状
- cv2.MORPH_RECT:矩形
- cv2.MORPH_ELLIPSE:椭圆
- cv2.MORPH_CROSS:十字形
ksize:核的大小
返回值
核
函数cv2.erode
腐蚀,去毛刺
传入三个参数,图、核、迭代次数
cv2.erode(binary, erode_kernel, iterations=1)
函数cv2.dilate
膨胀便圆润
传入三个参数,图、核、迭代次数
cv2.dilate(erosion, dilation_kernel, iterations = 1)
函数cv2.threshold(src, thresh, maxval, type[, dst])
根据设定的值处理图像的灰度值,例如大于设定值就保留或者修改
src:是灰度图像
thresh:起始阈值
maxval:是最大值
type:处理方式,有如下类型
- cv2.THRESH_BINARY:大于阈值的像素点赋值为maxval,小于阈值的像素点赋值为0
- cv2.THRESH_BINARY_INV:大于阈值的像素点赋值为0,小于阈值的像素点赋值为maxval
- cv2.THRESH_TRUNC:大于阈值的像素点赋值为thresh,小于阈值的像素点不变
- cv2.THRESH_TOZERO:大于阈值的像素点不变,小于阈值的像素点赋值为0
- cv2.THRESH_TOZERO_INV:大于阈值的像素点赋值为0,小于阈值的像素点不变
返回值:ret,thresh1
ret:阈值
thresh1:处理后的图像
opencv轮廓检测后裁剪图片
https://blog.kala.love/posts/ee7b39c3/