opencv 形态学操作,opencv形态学处理
运算形态学,即数学形态学,是图像处理过程中一个非常重要的研究方向。
形态学主要从图像中提取成分信息,通常对表达和刻画图像的形状具有重要意义,通常是图像理解中使用的最本质的形状特征。
形态学运算主要有:腐蚀、膨胀、开运算、闭运算、形态学梯度运算、高帽运算(top hat operation)、黑帽运算等。
腐蚀和膨胀操作是形态学操作的基础。通过结合腐蚀和膨胀操作,可以实现不同形式的操作,例如开操作、闭操作、形态梯度操作、顶帽操作、黑帽操作和击中-错过操作。
腐蚀可以消除图像的边界点,使图像沿边界向内收缩,也可以去除比指定结构元素小的部分。
腐蚀用于“缩小”或“细化”二值图像中的前景,从而实现去噪、元素分割等功能。
在蚀刻过程中,通常使用结构元素对待蚀刻图像进行逐像素扫描,并根据结构元素与蚀刻图像之间的关系来确定蚀刻结果。
诸如蚀刻的形态学操作逐个像素地确定值,并且每个确定的点是对应于结构元素的中心的点。
如果结构元素完全在前景图像中,那么结构元素中心点对应的腐蚀结果图像中的像素将被视为前景色(白色,每个像素的像素值为1)。如果结构元素不完全在前景图像中(可能部分存在,也可能完全不存在),腐蚀结果图像中对应于结构元素中心点的像素将被视为背景色(黑色,像素的像素值为0)。当核完全位于前景图像中时,对应于其中心点的rst中的像素值被设置为1;当内核没有完全位于前景图像中时,对应于其中心点的rst中的像素值被设置为0。
使用函数cv2.erode()实现腐蚀操作,其语法为:
DST=cv2.erode (src,kernel [,anchor [,iterations [,border type [,border value]])DST是腐蚀后的目标图像输出,与原图像具有相同的类型和大小。Src是需要刻蚀的原始图像,图像的通道数可以任意。但是图像类型必须是CV_8U、CV_16U、CV_16S、CV_32F和CV_64F之一。内核表示腐蚀操作中使用的结构类型。它可以由custom生成,也可以由函数cv2.getStructuringElement()生成。Anchor表示元素结构中定位点的位置。默认值为(-1,-1),位于核心的中心。迭代次数是蚀刻操作的迭代次数,默认为1,即只进行一次蚀刻操作。BorderType表示边框样式,一般采用默认值BORDER_CONSTANT。
BorderValue是边界值,通常是默认值。C中提供了函数morphologyDefaultBorderValue()来返回腐蚀和膨胀的“神奇”边界值,Python不支持该函数。
用数组演示腐蚀的基本原理。
导入cv2
将numpy作为np导入
img=np.zeros((5,5),np.uint8)
img[1:4,1:4]=1
kernel=np.ones((3,1),np.uint8)
erosion=cv2.erode(img,内核)
print(img=\n ,img)
print(kernel=\n ,kernel)
Print(erosion=\n ,erosion)使用函数cv2.erode()完成图像腐蚀。
导入cv2
将numpy作为np导入
o=cv2.imread(erode.bmp ,cv2。IMREAD _未更改)
kernel=np.ones((5,5),np.uint8)
erosion=cv2.erode(o,kernel)
cv2 . im show( or original ,o)
cv2.imshow(侵蚀,侵蚀)
cv2.waitKey()
cv2.destroyAllWindows()
经处理的图像是二值图像。
膨胀操作和腐蚀操作具有相反的效果,膨胀操作可以扩大图像的边界。扩展操作将与当前对象(前景)接触的背景点合并到当前对象中,从而向外扩展图像的边界点。
如果图像中的两个对象之间的距离很近,则这两个对象可能在扩展过程中连接在一起。在图像分割之后,扩展操作非常有助于填充图像中的空隙。
在扩展过程中,还使用结构元素对待扩展图像进行逐像素扫描,根据结构元素与待扩展图像的关系确定扩展结果。
如果结构元素中的任何点在前景图像中,则膨胀结果图像中的对应像素被视为前景色。如果结构元素完全脱离背景图像,则扩展结果图像中的相应像素将被视为背景颜色。函数cv2.dilate()用于扩展图像:
DST=CV2。Dilate (src,kernel [,anchor [,iterations [,border type [,border value]])DST表示扩展后的目标图像,其类型和大小与原始图像相同。Src表示需要扩展的原始图像。图像的通道数可以是任意的,但要求图像类型必须是CV_8U、CV_16U、CV_16S、CV_32F和CV_64F中的一种。元素表示扩展操作采用的结构类型。它可以由custom生成,也可以由函数cv2.getStructuringElement()生成。参数kernel、anchor、iterations、borderType和borderValue与函数cv2.erode()中的相应参数具有相同的含义。用数组演示膨胀的基本原理。
导入cv2
将numpy作为np导入
img=np.zeros((5,5),np.uint8)
img[2:3,1:4]=1
kernel=np.ones((3,1),np.uint8)
dilation=cv2.dilate(img,内核)
print(img=\n ,img)
print(kernel=\n ,kernel)
Print(dilation\n ,dilation)使用函数cv2.dilate()来完成图像扩展操作。
导入cv2
将numpy作为np导入
o=cv2.imread(dilation.bmp ,cv2。IMREAD _未更改)
kernel=np.ones((9,9),np.uint8)
dilation=cv2.dilate(o,kernel)
#膨胀=CV2。Dilate (O,kernel,iterations=9) # iterations=9控制迭代次数,使展开重复9次。
cv2.imshow(original ,o)
cv2 . im show( exploation ,膨胀)
cv2.waitKey()
2.cv2.destroyAllWindows()的通用形态学函数腐蚀运算和膨胀运算是形态学运算的基础。通过结合腐蚀和膨胀操作,可以实现多种不同形式的操作,如开操作、闭操作(闭操作)、形态渐变操作、高帽操作(高帽操作)、黑帽操作、中击等。
函数cv2.morphologyEx()实现了上述形态学运算,其语法结构如下:
DST=CV2。Morphology EX (src,op,kernel [,anchor [,iterations [,border type [,border value]])DST表示形态学处理后的目标图像,与原始图像具有相同的类型和大小。SRC表示需要进行形态学运算的原始图像。图像的通道数可以是任意的,但要求图像类型必须是CV_8U、CV_16U、CV_16S、CV_32F和CV_64F中的一种。Op代表运算类型,各种形态运算的运算规则是通过腐蚀和膨胀运算相结合得到的。
参数kernel、anchor、iterations、borderType和borderValue与函数cv2.erode()中的相应参数具有相同的含义。开运算的操作是先腐蚀图像,再扩大腐蚀的结果。开运算可用于去噪、计数等。
打开操作可以通过将函数cv2.morphologyEx()中的操作类型参数op设置为“cv2”来实现。MORPH_OPEN”。
opening=cv2.morphologyEx(img,cv2。MORPH_OPEN,内核)导入cv2
将numpy作为np导入
img1=cv2.imread(opening.bmp )
img2=cv2.imread(opening2.bmp )
k=np.ones((10,10),np.uint8)
r1=cv2.morphologyEx(img1,cv2。MORPH_OPEN,k)
r2=cv2.morphologyEx(img2,cv2。MORPH_OPEN,k)
cv2.imshow(img1 ,img1)
cv2.imshow(result1 ,r1)
cv2.imshow(img2 ,img2)
cv2.imshow(result2 ,r2)
cv2.waitKey()
2.cv2.destroyAllWindows()封闭操作封闭操作是一种先膨胀后腐蚀的操作。它有助于关闭前景对象中的小孔或去除对象上的小黑点,还可以连接不同的前景图像。
内部封闭操作
原始图像经过膨胀腐蚀后,实现内部孔洞闭合的目的。
近距离操作还可以实现前景图像的连接。
关闭操作可以通过将函数cv2.morphologyEx()中的操作类型参数op设置为“cv2。MORPH_CLOSE”。
closing=cv2.morphologyEx(img,cv2。MORPH_CLOSE,内核)导入cv2
将numpy作为np导入
img1=cv2.imread(closing.bmp )
img2=cv2.imread(closing2.bmp )
k=np.ones((10,10),np.uint8)
r1=cv2.morphologyEx(img1,cv2 .变形_关闭,k,迭代次数=3)
r2=cv2.morphologyEx(img2,cv2 .变形_关闭,k,迭代次数=3)
cv2.imshow(img1 ,img1)
cv2.imshow(result1 ,r1)
cv2.imshow(img2 ,img2)
cv2.imshow(result2 ,r2)
cv2.waitKey()
cv2.destroyAllWindows()形态学梯度运算形态学梯度运算是用图像的膨胀图像减腐蚀图像的操作,该操作可以获取原始图像中前景图像的边缘。
通过将函数cv2.morphologyEx()的操作类型参数外科手术设置为“cv2 .变形_渐变",可以实现形态学梯度运算。
result=cv2.morphologyEx(img,cv2 .MORPH_GRADIENT,内核)导入cv2
将数组作为铭牌导入
o=cv2.imread(gradient.bmp ,cv2 .IMREAD _未更改)
k=np.ones((5,5),np.uint8)
r=cv2.morphologyEx(o,cv2 .变形_渐变,k)
cv2.imshow(original ,o)
cv2.imshow(result ,r)
cv2.waitKey()
cv2.destroyAllWindows()礼帽运算礼帽运算是用原始图像减去其开运算图像的操作。
礼帽运算能够获取图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息。
通过将函数cv2.morphologyEx()中操作类型参数外科手术设置为“cv2 .MORPH_TOPHAT ",可以实现礼帽运算。
result=cv2.morphologyEx(img,cv2 .MORPH_TOPHAT,内核)导入cv2
将数组作为铭牌导入
o1=cv2.imread(tophat.bmp ,cv2 .IMREAD _未更改)
o2=cv2.imread(lena.bmp ,cv2 .IMREAD _未更改)
k=np.ones((5,5),np.uint8)
r1=cv2.morphologyEx(o1,cv2 .MORPH_TOPHAT,k)
r2=cv2.morphologyEx(o2,cv2 .MORPH_TOPHAT,k)
cv2.imshow(original1 ,o1)
cv2.imshow(original2 ,o2)
cv2.imshow(result1 ,r1)
cv2.imshow(result2 ,r2)
cv2.waitKey()
cv2.destroyAllWindows()黑帽运算黑帽运算是用闭运算图像减去原始图像的操作。黑帽运算能够获取图像内部的小孔,或前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分。
通过将函数cv2.morphologyEx()中操作类型参数外科手术设置为“cv2 .MORPH_BLACKHAT”,可以实现黑帽运算。
result=cv2.morphologyEx(img,cv2 .MORPH_BLACKHAT,内核)导入cv2
将数组作为铭牌导入
o1=cv2.imread(blackhat.bmp ,cv2 .IMREAD _未更改)
o2=cv2.imread(lena.bmp ,cv2 .IMREAD _未更改)
k=np.ones((5,5),np.uint8)
r1=cv2.morphologyEx(o1,cv2 .MORPH_BLACKHAT,k)
r2=cv2.morphologyEx(o2,cv2 .MORPH_BLACKHAT,k)
cv2.imshow(original1 ,o1)
cv2.imshow(original2 ,o2)
cv2.imshow(result1 ,r1)
cv2.imshow(result2 ,r2)
cv2.waitKey()
cv2.destroyAllWindows()核函数在进行形态学操作时,必须使用一个特定的核(结构元)。
该核可以自定义生成,也可以通过函数cv2.getStructuringElement()构造。
函数cv2.getStructuringElement()能够构造并返回一个用于形态学处理所使用的结构元素。
该函数的语法格式为:
retval=cv2。getstructuringelement(shape,ksize[,anchor])该函数用来返回一个用于形态学操作的指定大小和形状的结构元素。
形状代表形状类型
ksize代表结构元素的大小锚代表结构元素中的锚点位置。默认的值是(-1, -1),是形状的中心。只有十字星型的形状与锚点位置紧密相关。在其他情况下,锚点位置仅用于形态学运算结果的调整。
除了使用该函数,用户也可以自己构建任意二进制掩码作为形态学操作中所使用的结构元素。
使用函数cv2.getStructuringElement()生成不同结构的核。
导入cv2
内核1=cv2。getstructuringelement(cv2 .墨菲_RECT,(5.5))
内核2=cv2。getstructuringelement(cv2 .MORPH_CROSS,(5,5))
内核3=cv2。getstructuringelement(cv2 .变形_椭圆,(5,5))
print(kernel1=\n ,kernel1)
print(kernel2=\n ,kernel2)
print(kernel3=\n ,kernel3)不同的核对形态学操作的影响:
导入cv2
o=cv2.imread(kernel.bmp ,cv2 .IMREAD _未更改)
内核1=cv2。getstructuringelement(cv2 .墨菲_ RECT(59岁,59岁)
内核2=cv2。getstructuringelement(cv2 .MORPH_CROSS,(59,59))
内核3=cv2。getstructuringelement(cv2 .变形_椭圆,(59,59))
dst1=cv2.dilate(o,kernel1)
dst2=cv2.dilate(o,kernel2)
Dst3=cv2.dilate(o,kernel3)# inflation
cv2 . im show( or original ,o)
cv2.imshow(dst1 ,dst1)
cv2.imshow(dst2 ,dst2)
cv2.imshow(dst3 ,dst3)
cv2.waitKey()
cv2.destroyAllWindows()
风暴中的白杨
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。