'''
腐蚀原理:在一个卷积核内,如果存在不同的像素值,则某些像素会被另一部分腐蚀掉,即将其值修改为其他的像素值
当然,如果卷积核内像素值都一样则不会发生腐蚀,所以边界处腐蚀效果会更明显
'''
kernel = np.ones((3,3),np.uint8) #设置卷积核大小
erosion = cv2.erode(img,kernel,iterations = 1) #腐蚀操作
#这里iteration代表迭代的次数,即腐蚀的次数,腐蚀越多图像会慢慢消失因为像素都被修改成了同一个值
#同时也跟卷积核的大小有联系,卷积核小则需要腐蚀更多次才能有明显效果
下面展示不同迭代次数的效果
1.可以消除毛须,如果继续增加腐蚀次数,图片的字就会越来越模糊最后完全变成黑色
2.不断腐蚀图像不断变小
教程来自:https://www.bilibili.com/video/BV1oJ411D71z?p=2
可以简单理解是腐蚀的逆运算,但实际不是100%的逆运算
比如前面腐蚀操作去掉了图片中文字的毛须后,文字也会因为腐蚀变细,这时候再将腐蚀后的图片进行膨胀操作,可以在进行一定的还原,注意不是100%的逆操作
kernel = np.ones((3,3),np.uint8) #同样的设置卷积核的大小
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1) #参数设置大致同腐蚀操作相同
下面看看效果
这是经过腐蚀去掉了毛须后的图片,虽然去掉了毛须但文字的笔画也变细了
再进行膨胀操作如下,字体笔画变粗,基本还原了原来的粗细
不同迭代次数膨胀的效果如下
腐蚀和膨胀常常配合使用,腐蚀使图像受到了损害,再经过膨胀进行还原。
开运算 = 先腐蚀后膨胀
闭运算 = 先膨胀后腐蚀
将前面的操作汇总到一个函数中实现
而在OpenCV中提供了形态学函数morphologyEx()
可以更简便的进行
开运算参数:cv2.MORPH_OPEN
闭运算参数:cv2.MORPH_CLOSE
kernel = np.ones((5,5),np.uint8) #同样的设置好核大小
'''开闭运算就是函数的参数选择的不同'''
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) #开运算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) #闭运算
梯度=膨胀-腐蚀
什么是膨胀-腐蚀:拿一个圆来说,膨胀使圆变大,腐蚀使圆变小,一个 变大的圆-变小的圆 = 圆的轮廓。因此梯度运算可以得出一个图像的轮廓信息
同样的还是用形态学函数morphologyEx()
参数:cv2.MORPH_GRADIENT
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
礼帽 = 原始输入 - 开运算
黑帽 = 闭运算 - 原始输入
以迪哥这张图为例
1.开运算后,会去掉图像中文字的毛须,进行礼帽操作后,用原始图片减去开运,即有毛须减去无毛须图片,得出的图片只会剩下毛须
2.闭运算后,图片中的毛须仍然存在,进行黑帽操作后,,用闭运算结果减去原始图片,即有毛须减去有毛须的图片,得出的图片毛须消失了,只保留下来点点文字的轮廓
还是用形态学函数morphologyEx()
礼帽参数:cv2.MORPH_TOPHAT
黑帽参数:cv2.MORPH_BLACKHAT
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) #礼帽
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel) #黑帽
礼帽效果如下,只剩下毛须
黑帽效果如下,只剩下文字点点的轮廓
教程来自:https://www.bilibili.com/video/BV1oJ411D71z?p=2