【OpenCV——形态学操作】

目录

一、连通性

二、腐蚀和膨胀

1.描述:

2.腐蚀:

3.膨胀:

4.代码实现:

 三、开闭运算

1.描述:

2.开运算:

3.闭运算:

4.代码实现开运算:

5.代码实现闭运算:

 四、礼帽和黑帽

1.礼帽运算:

2.黑帽运算:

3.代码实现礼帽运算:


一、连通性

1.图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见邻接关系有:4邻接、D邻接和8邻接,如下图所示:

1> 4邻接:像素p(x,y)的4邻域是: (x+1,y),(x-1,y),(x,y+1),(x,y-1)用N4(p)表示像素p的4邻接
2>D邻接:像素p(x,y)的D邻域是:对角上的点(x+1,y+1),(x+1,y-1),(x-1,y+1),(x-1,y-1), 用ND(p)表示像素p的D邻域
3>8邻接:像素p(x,y)的8邻域是: 4邻域的点+ D邻域的点,用N8(p)表示像素p的8邻域

2.连通性是描述区域与边界的重要概念,俩个像素连通的必要条件:两个像素的位置是否相邻以及像素的灰度值是否满足特定相似性准则

1>对于具有真值V的像素p和q,如果q在集合N4(p)中,则两个像素是4连通

2>对于具有真值V的像素p和q,如果q在集合N8(p)中,则两个像素是8连通 

二、腐蚀和膨胀

1.描述:

形态学操作是基于图像形状一些简单操作,通常在二进制图像上执行,腐蚀和膨胀是两个基本的形态学运算符,二者都是针对高亮部分而言,膨胀是使图像中的高亮部分扩充,腐蚀是使图像中高亮区域被蚕食,膨胀是求局部最大值操作,腐蚀是求局部最小值操作

2.腐蚀:

用一个结构元素扫描图像中每一个像素,结构元素中的每一个像素与其覆盖像素与操作,都为1,则该像素为1,否则为0,腐蚀的作用是消除物体边界点,消除小于结构元素的噪声点

cv.erode(img,kernel,iterations)

参数:kernel:核结构  iterations:腐蚀的次数,默认是1

3.膨胀:

用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做与操作,如果都为0,则该像素为0,否则为1,膨胀的作用是将与物体接触的所有背景点合并到物体中,填补目标中的孔洞

cv.dilate(img,kernel,iterations)

参数:kernel:核结构  iterations:膨胀的次数,默认是1

4.代码实现:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#获取图像
img=cv.imread('word1.png')
#原图显示
#plt.imshow(img[:,:,::-1])
#plt.show()
#创建核结构
kernel=np.ones((5,5),np.uint8)
#腐蚀操作
img1=cv.erode(img,kernel)
#plt.imshow(img1[:,:,::-1])
#plt.show()
#膨胀
img2=cv.dilate(img,kernel)
plt.imshow(img2[:,:,::-1])
plt.show()

 三、开闭运算

 1.描述:

 开闭运算是将腐蚀和膨胀按照一定的次序进进行处理,但是二者是不可逆的,即先开后闭不能得到原来的图像

2.开运算:

开运算是先腐蚀后膨胀,作用是分离物体,消除小区域,消除噪点,而不影响原来图像

cv.morphologyEx(img,cv.MORPH_OPEN,kernel) 

3.闭运算:

闭运算是先膨胀后腐蚀,作用是消除闭合物体里面的孔洞,可以填充闭合区域

cv.morphologyEx(img,cv.MORPH_CLOSE,kernel) 

4.代码实现开运算:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取图像
img=cv.imread('word2.png')
#原图显示
#plt.imshow(img[:,:,::-1])
#plt.show()
#进行开运算
kernel=np.ones((10,10),np.uint8)
cvopen=cv.morphologyEx(img,cv.MORPH_OPEN,kernel)
#显示图像
plt.imshow(cvopen[:,:,::-1])
plt.show()

 

 5.代码实现闭运算:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取图像
img=cv.imread('word3.png')
#原图显示
#plt.imshow(img[:,:,::-1])
#plt.show()
#进行开运算
kernel=np.ones((10,10),np.uint8)
cvopen=cv.morphologyEx(img,cv.MORPH_CLOSE,kernel)
#显示图像
plt.imshow(cvopen[:,:,::-1])
plt.show()

 四、礼帽和黑帽

 1.礼帽运算:

原图像与开运算的结果差,开运算放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,操作和选择的核的大小相关。礼帽运算用来分离比邻近点亮一些的斑块。 当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

 cv.morphologyEx(img,cv.MORPH_TOPHAT)

2.黑帽运算:

闭运算的结果图与原图像之差,闭运算填充了裂缝或者扩大局部高亮度的区域,因此,从结果图中减去原图后,得到的效果图突出了比原图区域更暗的区域,且这一操作和选择的核的大小相关,黑帽运算用来分离比邻近点暗一些的斑块。

 cv.morphologyEx(img,cv.MORPH_BLACKHAT)

3.代码实现礼帽运算:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取图像
img=cv.imread('word2.png')
#创建核结构
kernel=np.ones((10,10),np.uint8)
#进行礼帽运算
cvtophat=cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)
plt.imshow(cvtophat[:,:,::-1])
plt.show()

 4.代码实现黑帽运算:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取图像
img=cv.imread('word3.png')
#创建核结构
kernel=np.ones((10,10),np.uint8)
#进行礼帽运算
cvtophat=cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)
plt.imshow(cvtophat[:,:,::-1])
plt.show()

猜你喜欢

转载自blog.csdn.net/m0_70964767/article/details/127143343