一、形态学变化
形态学变换(Morphological Transformations)是一种基于形状的图像处理技术,主要处理的对象为二值化图像。
形态学变换有两个输入和一个输出:输入为原始图像和核(即结构化元素),输出为经过形态学变换后的图像。
其基本操作包括腐蚀(Erosion)和膨胀(Dilation),这两种操作互为反向过程,分别对图像中的亮度值产生不同的影响。
二、核
核,或称结构化元素,是用于形态学变换的一个小的二值图像,通常呈现为简单的几何形状,例如矩形、椭圆形或十字形等。结构化元素的大小和形状直接影响腐蚀和膨胀操作的效果。
2.1、矩形
2.2、椭圆形
2.3、十字形
三、腐蚀
腐蚀操作就是使用核在原图(二值化图)上进行从左到右、从上到下的滑动(也就是从图像的左上角开 始,滑动到图像的右下角)。在滑动过程中,令核值为1的区域与被核覆盖的对应区域进行相乘,得到其 最小值,该最小值就是卷积核覆盖区域的中心像素点的新像素值,接着继续滑动。由于操作图像为二值 图,所以不是黑就是白,这就意味着,在被核值为1覆盖的区域内,只要有黑色(像素值为0),那么该 区域的中心像素点必定为黑色(0)。这样做的结果就是会将二值化图像中的白色部分尽可能的压缩,如 下图所示,该图经过腐蚀之后,“变瘦”了。
导入模块
import cv2
读取图片
img=cv2.imread('img.png')
灰度化
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
二值化
ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
创建核
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15))
腐蚀
img_erode=cv2.erode(img_threshold,kernel)
显示图片
cv2.imshow('img_gray',img_gray)
cv2.imshow('img_erode',img_erode)
cv2.waitKey(0)
完整代码
import cv2 # 导入OpenCV库 # 读取图像
img = cv2.imread('img.png') # 将图像转换为灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 对灰度图像应用阈值处理,以获得二值图像
# ret: 用于输出阈值值,img_threshold: 阈值处理后的图像
ret, img_threshold = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) # 创建一个15x15的十字形结构元素(腐蚀操作所用的卷积核)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (15, 15)) # 对阈值处理后的图像进行腐蚀操作
img_erode = cv2.erode(img_threshold, kernel) # 显示腐蚀处理后的图像
cv2.imshow('img_erode', img_erode) # 等待用户按键后关闭窗口
cv2.waitKey(0)
四、膨胀
膨胀与腐蚀刚好相反,膨胀操作就是使用核在原图(二值化图)上进行从左到右、从上到下的滑动(也 就是从图像的左上角开始,滑动到图像的右下角),在滑动过程中,令核值为1的区域与被核覆盖的对应 区域进行相乘,得到其最大值,该最大值就是核覆盖区域的中心像素点的新像素值,接着继续滑动。由 于操作图像为二值图,所以不是黑就是白,这就意味着,在卷积核覆盖的区域内,只要有白色(像素值 为255),那么该区域的中心像素点必定为白色(255)。这样做的结果就是会将二值化图像中的白色部 分尽可能的扩张,如下图所示,该图经过腐蚀之后,“变胖”了。
导入模块
import cv2
读取图片
img=cv2.imread('img.png')
灰度化
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
二值化
ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
创建核
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15))
膨胀
img_dilate=cv2.dilate(img_threshold,kernel)
显示图片
cv2.imshow('img_dilate',img_dilate)
cv2.waitKey(0)
完整代码
import cv2 # 导入OpenCV库 # 读取图像
img = cv2.imread('img.png') # 将图像转换为灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 对灰度图像应用阈值处理,以获得二值图像
# ret: 用于输出阈值值,img_threshold: 阈值处理后的图像
ret, img_threshold = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) # 创建一个15x15的十字形结构元素(膨胀操作所用的卷积核)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (15, 15)) # 对阈值处理后的图像进行膨胀操作
# 膨胀会增强图像中亮区域的大小
img_dilate = cv2.dilate(img_threshold, kernel) # 显示膨胀处理后的图像
cv2.imshow('img_dilate', img_dilate) # 等待用户按键后关闭窗口
cv2.waitKey(0)
五、库函数
5.1、getStructuringElement()
cv.getStructuringElement( shape, ksize[, anchor] ) -> retval
方法 | 描述 |
---|---|
shape | 可以是 MorphShapes 之一 |
ksize | 结构元素的大小。 |
anchor | 元素内的锚点位置。默认值(−1,−1)表示锚点位于中心。请注意,只有十字形元素的形状取决于锚点位置。在其他情况下,锚点只是调节形态作的结果偏移了多少 |
MorphShapes | |
MORPH_RECT Python:cv.MORPH_RECT | 矩形结构元素: |
MORPH_CROSS Python:cv.MORPH_CROSS | 十字形结构元件: |
MORPH_ELLIPSE Python:cv.MORPH_ELLIPSE | 椭圆结构元素,即内接到矩形 Rect(0, 0, esize.width, esize.height) 中的填充椭圆 |
5.2、erode()
cv.erode( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) -> dst
方法 | 描述 |
---|---|
src | 输入图像;通道数可以是任意的,但深度应该是 CV_8U、 CV_16U、 CV_16S、 CV_32F 或 CV_64F 之一。 |
dst | 输出图像的大小和类型与 src 相同。 |
kernel | 用于侵蚀的结构元件;如果 ,则使用矩形结构元素。可以使用 getStructuringElement 创建 Kernel。element=Mat() 3 x 3 |
anchor | 锚点在元素中的位置;默认值 (-1, -1) 表示锚点位于元素中心。 |
iterations | 应用 腐蚀的次数。 |
borderType | 像素外插方法,请参阅 BorderTypes。不支持BORDER_WRAP。 |
borderValue | border 值(如果边界为常量) |
5.3、 dilate()
cv.dilate( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) -> dst
方法 | 描述 |
---|---|
src | 输入图像;通道数可以是任意的,但深度应该是 CV_8U、 CV_16U、 CV_16S、 CV_32F 或 CV_64F 之一。 |
dst | 输出图像的大小和类型与 src 相同。 |
kernel | 用于扩张的结构元件;如果 element=Mat(),则使用 3 x 3 矩形结构元素。可以使用 getStructuringElement 创建 Kernel |
anchor | 锚点在元素中的位置;默认值 (-1, -1) 表示锚点位于元素中心。 |
iterations | 应用扩张的次数。 |
borderType | 像素外插方法,请参阅 BorderTypes。不支持BORDER_WRAP。 |
borderValue | border 值(如果边界为常量) |