Open CV系列学习笔记(二十)膨胀与腐蚀
图像形态学
图像形态学是图像处理学科的一个单独分支学科
灰度与二值图像处理中重要手段
是由数学的集合论等相关理论发展起来的

图像膨胀
膨胀是在二值图像中“加长”或“变粗”的操作。这种特殊的方式和变粗的程度由一个称为结构元素的集合控制。图中说明了膨胀的计算过程。图(a)显示了包含一个矩形对象的简单二值图像;图(b)是一个结构元素,在此例中它是一条5个像素长的斜线。计算时,结构元素通常用0和1的矩阵表示。有时,如图中所示,为方便起见可只显示1。另外,结构元素的原点必须明确标明。图(b)用黑色方框标明了结构元素的原点。图©明确地描述了膨胀处理,这种处理会将结构元素的原点平移过整个图像区域,并且核对哪些地方与值为I的像素重叠。图(d)所示的输出图像在原点的每个位置均为1,从而在输人图像中结构元素至少重叠了一个1值像素。
3x3的结构元素/模板
注意:
-腐蚀与膨胀都支持
-任意形状的结构元素

膨胀满足交换律:即A⊕B=B⊕A .在图像处理中,习惯于令A⊕B的第一个操作数为图像,而第二个操作数微结构元素,结构图像往往比元素小很多。
膨胀的作用
对象大小增加一个像素(3x3)
平滑对象边缘
减少或者填充对象之间的距离.
代码:
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.
cv.imshow("binary",binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,10))
dst = cv.dilate(binary,kernel)
cv.imshow("erode_demo",dst)
结果:


图像腐蚀
腐蚀“收缩"或“细化”二值图像中的对象。像在膨胀中一样, 收缩的方式和程度由一个结构元素控制。下图说明了腐蚀过程。图膨胀(a)和图腐蚀(a)相同,图腐蚀(b)是结构元素,即一条短垂直线。图腐蚀©生动地描述了腐蚀在整个图像区域平移结构元素的过程,并检查在哪里完全匹配图像的前景部分。图腐蚀(d)所示的输出图像中,结构元素原点的每个位置的值为1,因而该元素仅叠加了输人图像的1值像素(即它并不叠加任何图像背景)。
腐蚀的数学定义与膨胀相似,A被B腐蚀记为AB,定义为

换言之,A被B腐蚀是所有结构元素的原点位置的集合,其中平移的B与A的背景并不叠加。

腐蚀的作用
对象大小减少1个像素(3x3)
平滑对象边缘
弱化或者分割图像之间的半岛型连接
代码:
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)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,10))
dst = cv.erode(binary,kernel)
cv.imshow("erode_demo",dst)
结果:


完整代码:
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)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,10))
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,10))
dst = cv.dilate(binary,kernel)
cv.imshow("erode_demo",dst)
print("--------HEllow Python-------")
src = cv.imread("E:/picture/01.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
erode_demo(src)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(4,4))
dst = cv.erode(src,kernel)
cv.imshow("output",dst)
cv.waitKey(0)
cv.destroyAllWindows()
本文介绍了OpenCV中的图像膨胀和腐蚀操作,这两种技术在二值图像处理中至关重要,通过结构元素控制对象的大小变化和边缘平滑。膨胀使对象变粗,腐蚀则细化对象。实例展示了使用3x3和自定义结构元素进行操作的过程。
469





