zl程序教程

您现在的位置是:首页 >  后端

当前栏目

opencv 形态学转换

Opencv转换 形态学
2023-09-27 14:25:47 时间

腐蚀

腐蚀可以将前景物体的边界腐蚀掉。 卷积核沿着图像滑动,如果与卷积核对应的原图像所有像素值都是1,那么中心元素保持原来的像素值,否则就变为0.

import cv2
import numpy as np

img = cv2.imread('./1.png', 0)

#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)

cv2.imshow('erode', np.hstack((img,erosion)))
cv2.imwrite('img.png',np.hstack((img,erosion)))
cv2.waitKey(0)
cv2.destroyAllWindows()

观察上图,腐蚀操作其实就是在卷积核内求最小值的操作。 所以这种操作会使白色区域减少,这对于去除白噪声很有用,也可以用来断开两个连在一块的物体。

膨胀

与腐蚀相反,与卷积核相应的原图像中的像素值中只要有一个是1,中心元素就是1.所以这个操作会增加图像中的白色区域。

import cv2
import numpy as np

img = cv2.imread('1.png', 0)

kernel = np.ones((3, 3), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)

cv2.imshow('dilation', np.hstack((img,dilation)))
cv2.imwrite('image.png',np.hstack((img,dilation)))
cv2.waitKey(0)
cv2.destroyAllWindows()

在卷积核内取最大值。这里也可以认为是进行按位或运算 

开运算 

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

先进行腐蚀在进行膨胀叫做开运算。

import cv2
import numpy as np

img = cv2.imread('1.png', 0)

#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)

# 开运算:先腐蚀再膨胀就叫做开运算。
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', np.hstack((img,opening)))
cv2.imwrite('image.png',np.hstack((img,opening)))
cv2.waitKey()

闭运算

先膨胀后腐蚀叫做闭运算

 cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
import cv2
import numpy as np

img = cv2.imread('1.png', 0)

#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)

# 先膨胀再腐蚀。它经常 用来填充前景物体中的小洞 或者前景物体上的小黑点。
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('opening', np.hstack((img,closing)))
cv2.imwrite('image.png',np.hstack((img,closing)))
cv2.waitKey()

 

形态学梯度

其实就是一幅图像膨胀和腐蚀的差,结果看上去就像前景物体的轮廓

cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
import cv2
import numpy as np

img = cv2.imread('1.png', 0)

#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)

# 形态学梯度
# 其实就是一幅图像膨胀与腐蚀 的差。
# 结果看上去就像前景物体的轮廓。
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('opening', np.hstack((img,gradient)))
cv2.imwrite('image.png',np.hstack((img,gradient)))
cv2.waitKey()

 

礼帽

原始图像与开运算的图像差

cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
import cv2
import numpy as np

img = cv2.imread('1.png', 0)

#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)

# 礼帽
# 原始图像与  开运算之后得到的图像的差。
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

cv2.imshow('opening', np.hstack((img,tophat)))
cv2.imwrite('image.png',np.hstack((img,tophat)))
cv2.waitKey()

 

黑帽

闭运算后得到的图像和原始图像的差

cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
import cv2
import numpy as np

img = cv2.imread('1.png', 0)

#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)

# 黑帽
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

cv2.imshow('opening', np.hstack((img,blackhat)))
cv2.imwrite('image.png',np.hstack((img,blackhat)))
cv2.waitKey()

  

结构化元素

cv2.getStructuringElement()
# Rectangular Kernel
>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]], dtype=uint8)
# Elliptical Kernel
>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [0, 0, 1, 0, 0]], dtype=uint8)
# Cross-shaped Kernel
>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0],
       [1, 1, 1, 1, 1],
       [0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0]], dtype=uint8)