形态学操作(morphology operators)-膨胀与腐蚀(Dilation与Erosion)。
图像形态学操作
1、图像形态学操作 – 基于形状的一系列图像处理操作的合集
2、形态学有四个基本操作:腐蚀、膨胀、开、闭
3、膨胀与腐蚀是图像处理中最常用的形态学操作手段
4、腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。
5、膨胀与腐蚀能实现多种多样的功能,主要如下:
消除噪声
分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域
求出图像的梯度
相关的 API
getStructuringElement(int shape, Size ksize, Point anchor)
形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
大小
锚点 默认是Point(-1, -1)意思就是中心像素
1.1 膨胀
相关的API:dilate
跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状
膨胀的作用
对象大小增加一个像素(3x3)
平滑对象边缘
减少或者填充对象之间的距离
- 形态学操作-腐蚀
相关的API:erode
腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值
腐蚀的作用:
对象大小减少1个像素(3x3)
平滑对象边缘
弱化或者分割图像之间的半岛型连接
代码实现:
import cv2 as cv
import numpy as np
#腐蚀
def erode_demo(image):
print(image.shape)
#灰度图像
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
#二值化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary", binary)
#得到结构元素,(15, 15)可以控制腐蚀程度
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
#腐蚀
dst = cv.erode(binary, kernel)
cv.imshow("erode_demo", dst)
#膨胀
def dilate_demo(image):
print(image.shape)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
#膨胀
dst = cv.dilate(binary, kernel)
cv.imshow("dilate_demo", dst)
print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/demo.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
#erode_demo(src)
#也可以对彩色图像进行膨胀腐蚀操作,单通道、多通道都支持
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.erode(src, kernel)
cv.imshow("result", dst)
cv.waitKey(0)
cv.destroyAllWindows()