1.图像的腐蚀,膨胀操作与自动获取形态学卷积核
1.1 形态学概述
- 什么是形态学
- 指一系列处理图像形状特征的图像处理技术
- 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
- 这些处理方法基本是对二进制图像进行处理, 即黑白图像
- 卷积核决定着图像处理后的效果
- 形态学常用基本操作有:
- 膨胀和腐蚀
- 开运算
- 闭运算
- 顶帽
- 黑帽
1.2 腐蚀操作
腐蚀操作类似于将图像进行缩边
-
腐蚀操作也是用卷积核扫描图像, 只不过腐蚀操作的卷积和一般都是1, 如果卷积核内所有像素点都是白色, 那么锚点即为白色.
-
大部分时候腐蚀操作使用的都是全为1的卷积核.
-
erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
- iterations是腐蚀操作的迭代次数, 次数越多, 腐蚀操作执行的次数越多, 腐蚀效果越明显
代码实现
#读取图片
img= cv2.imread('./code/j2.png')
#定义腐蚀操作 卷积核
kernel=np.ones((5,5),np.uint8)
#进行腐蚀操作
dst=cv2.erode(img,kernel,iterations=1)
cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如图所示 左侧为腐蚀前,右侧为腐蚀后
1.3 自动获取形态学卷积核
上面的腐蚀操作中,我们自行创建了一个5*5 的全1卷积核,但是遇到复杂的图像操作时,我们不可能每次都自行指定卷积核,因此opencv提供了获取卷积核的api.不需要我们手工创建卷积核.
- getStructuringElement(shape, ksize[, anchor])
- shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.
- MORPH_RECT 卷积核中的1是矩形, 常用.
- MORPH_ELLIPSE 椭圆
- MORPH_CROSS 十字
- shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.
自动获取卷积核的实现与个形状卷积核对比
#读取图片
import numpy as np
import cv2
img= cv2.imread('./j2.png')
#自动获取卷积核
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
kerne2=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
kerne3=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
#进行腐蚀操作
dst=cv2.erode(img,kernel,iterations=1)
dst2=cv2.erode(img,kerne2,iterations=1)
dst3=cv2.erode(img,kerne3,iterations=1)
cv2.imshow('img',np.hstack((img,dst,dst2,dst3)))
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下
图片中卷积核的顺序依次为 原图,MORPH_RECT(矩形卷积核),MORPH_ELLIPSE(椭圆卷积核),MORPH_CROSS(十字卷积核)
1.4 膨胀操作
膨胀操作类似对图像进行扩边
膨胀是腐蚀的相反操作, 基本原理是只要保证卷积核的锚点是非0值, 周边无论是0还是非0值, 都变成非0值.
- dilate(img, kernel, iterations=1)
代码实现
import cv2
import numpy as np
img = cv2.imread('./j.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.dilate(img, kernel, iterations=2)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如图
腐蚀与膨胀操作 对比
#读取图片
img= cv2.imread('./j.png')
#自动获取卷积核
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# 进行腐蚀操作
dst1=cv2.erode(img,kernel,iterations=1)
#进行膨胀操作
dst2=cv2.dilate(img,kernel,iterations=1)
cv2.imshow('img',np.hstack((img,dst1,dst2)))
cv2.waitKey(0)
cv2.destroyAllWindows()