本章学习图像处理中的形态学处理,膨胀,腐蚀。
腐蚀(erode)、膨胀(dilate)
1)结构元(StructingElement)在形态学处理中经常用到,和前几章所学的卷积核、算子意思类似,都是用于对图片处理的小矩阵。腐蚀和膨胀均用到了结构元。
cv中提供了很多结构元的类型:十字型:cv.MORPH_CROSS
,矩形:cv.MORPH_RECT
,椭圆形:cv.MORPH_ELLIPSE
结构元是二维矩阵,内部元素去整数0或者1。
对二值图,元素取0或255,对应黑与白。
对灰度图,取0-255
对于彩色图,每个通道取0-255
可以自定义结构元也可以直接使用cv中cv.getStructuringElement()
的方法
K1 = np.ones((3,3),dtype=np.uint8)
K2 = cv.getStructuringElement(cv.MORPH_ELLIPSE,(7,7))#结构元
2)腐蚀
用于消除毛刺和小区域,可能会使得图像变暗。
在二值图中:
腐蚀:结构元为1出图像均为255,则整个结构元中心区域变为255,否则变为0
在灰度图中:
腐蚀:取结构元中的最小值作为新图像这个结构元区域的值。
img_erode= cv.erode(img,K1)
img_erode2 = cv.morphologyEx(img,cv.MORPH_ERODE,K1)
cv.erode(原图像,结构元)
cv.morphologyEx(原图像,cv.MORPH_ERODE,结构元)
3)膨胀
膨胀可以连接边缘,但是可以能会放大噪声
在二值图中:
腐蚀:结构元为1处图像均为0,则整个结构元中心区域变为0,否则变为255
在灰度图中:
腐蚀:取结构元中的最大值作为新图像这个结构元区域的值。
- 可以用直接用
cv.dilate(img,K1)
img_dilate = cv.dilate(img,K1)
show(img_dilate)
- 也可以用通用的
cv.morphologyEx(原图像,cv.MORPH_DILATE,结构元)
Kernel1 = cv.getStructuringElement(cv.MORPH_RECT,(1,3))
img_dilate1 = cv.morphologyEx(img,cv.MORPH_DILATE,Kernel1)
Kernel2 = cv.getStructuringElement(cv.MORPH_RECT,(3,1))
img_dilate2 = cv.morphologyEx(img,cv.MORPH_DILATE,Kernel2)
show(np.hstack([img,img_dilate1,img_dilate2]))
输出结果:
对于灰度图:
img_bird = cv.imread('pic/bird1000x800.jpg',0)
Kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(21,21))#结构元
img_erode = cv.morphologyEx(img_bird,cv.MORPH_ERODE,Kernel)
img_dilate = cv.morphologyEx(img_bird,cv.MORPH_DILATE,Kernel)
show(np.hstack([img_bird,img_erode,img_dilate]))
输出图像(原图像,腐蚀图像,膨胀图像)