07-形态学操作

1.图像腐蚀
在图像的形态学操作中腐蚀,主要是针对二值图像,使用卷积核的中心点逐个扫描原始图像,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1(白色)时,其值才为1(白色),否则值为0(黑色)

腐蚀是对白色部分(高亮部分)而言的,可以理解为删除对象边界的某些点的像素,也就是说效果图拥有比原图更小的高亮区域

函数erode
dst = cv2.erode(src,kernel,iterations)
1> src:源图像
2> kernel:卷积核
3> iterations:迭代次数,默认情况下迭代次数是1

比如:生成一个5*5的卷积核:
kernel = np.ones((5,5),np.uint8)

import cv2
import numpy as np

img = cv2.imread(r"image\erode.bmp",cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((5,5),np.uint8)
# 图像腐蚀
erosion = cv2.erode(img,kernel,iterations=5)

cv2.imshow("original",img)
cv2.imshow("erosion",erosion)

cv2.waitKey(0)
cv2.destroyAllWindows()

图像腐蚀的实验结果:

2.图像膨胀
图像膨胀是图像腐蚀的逆操作,也主要是针对二值图像,使用卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1(白色)时,其值就为1(白色),否则值为0(黑色)

膨胀也是对白色部分(高亮部分)而言的,也就是说效果图拥有比原图更大的高亮区域

函数dilate
dst = cv2.dilate(src,kernel,iterations)
1> src:源图像
2> kernel:卷积核
3> iterations:迭代次数,默认情况下迭代次数是1

比如:生成一个5*5的卷积核:
kernel = np.ones((5,5),np.uint8)

import cv2
import numpy as np

img = cv2.imread(r"image\dilation.bmp",cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((5,5),np.uint8)
# 图像膨胀
dilation = cv2.dilate(img,kernel,iterations=5)

cv2.imshow("original",img)
cv2.imshow("dilation",dilation)

cv2.waitKey(0)
cv2.destroyAllWindows()

图像膨胀的实验结果:

3.开运算
先腐蚀后膨胀,能够有效的去除噪声,并保持原有图像形状不变

函数morphologyEx
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
1> img:源图像
2> cv2.MORPH_OPEN:开运算
3> kernel:卷积核

比如:生成一个5*5的卷积核:
kernel = np.ones((5,5),np.uint8)

import cv2
import numpy as np

img = cv2.imread(r"image\opening.bmp",cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((10,10),np.uint8)
# 开运算,先腐蚀后膨胀
result= cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

cv2.imshow("original",img)
cv2.imshow("result",result)

cv2.waitKey(0)
cv2.destroyAllWindows()

开运算的实验结果:

4.闭运算
先膨胀后腐蚀,有助于关闭物体内的小孔,或者物体上的小黑点,并保持原有图像形状不变

函数morphologyEx
opening = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
1> img:源图像
2> cv2.MORPH_CLOSE:闭运算
3> kernel:卷积核

比如:生成一个5*5的卷积核:
kernel = np.ones((5,5),np.uint8)

import cv2
import numpy as np

img = cv2.imread(r"image\closing.bmp",cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((10,10),np.uint8)
# 闭运算,先膨胀后腐蚀
result= cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

cv2.imshow("original",img)
cv2.imshow("result",result)

cv2.waitKey(0)
cv2.destroyAllWindows()

5.梯度运算
通过对原始图像分别进行膨胀和腐蚀处理,使梯度图像 = 膨胀图像 - 腐蚀图像

函数morphologyEx
result = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
1> img:源图像
2> cv2.MORPH_GRADIENT:梯度运算
3> kernel:卷积核

比如:生成一个5*5的卷积核:
kernel = np.ones((5,5),np.uint8)

import cv2
import numpy as np

img = cv2.imread(r"image\gradient.bmp",cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((10,10),np.uint8)
# 梯度运算,梯度图像 = 膨胀图像 - 腐蚀图像
result= cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)

cv2.imshow("original",img)
cv2.imshow("result",result)

cv2.waitKey(0)
cv2.destroyAllWindows()

梯度运算的实验结果:

6.礼帽操作
通过对原始图像进行开运算处理,使礼帽图像 = 原始图像 - 开运算图像

函数morphologyEx
result = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
1> img:源图像
2> cv2.MORPH_TOPHAT:礼帽操作
3> kernel:卷积核

比如:生成一个5*5的卷积核:
kernel = np.ones((5,5),np.uint8)

import cv2
import numpy as np

img = cv2.imread(r"image\tophat.bmp",cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((5,5),np.uint8)
# 礼帽操作,礼帽图像 = 原始图像 - 开运算图像
result= cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

cv2.imshow("original",img)
cv2.imshow("result",result)

cv2.waitKey(0)
cv2.destroyAllWindows()

7.黑帽操作
通过对原始图像进行闭运算处理,使黑帽图像 = 闭运算图像 - 原始图像

函数morphologyEx
result = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
1> img:源图像
2> cv2.MORPH_BLACKHAT:黑帽操作
3> kernel:卷积核

比如:生成一个5*5的卷积核:
kernel = np.ones((5,5),np.uint8)

import cv2
import numpy as np

img = cv2.imread(r"image\blackhat.bmp",cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((10,10),np.uint8)
# 黑帽操作,黑帽图像 = 闭运算图像 - 原始图像
result= cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

cv2.imshow("original",img)
cv2.imshow("result",result)

cv2.waitKey(0)
cv2.destroyAllWindows()

黑帽操作的实验结果:

posted @ 2021-09-15 18:16  马铃薯1  阅读(84)  评论(0编辑  收藏  举报