6.opencv图像形态学操作

一、图像腐蚀(变瘦)

结构元素与目标区域进行完全覆盖,保留结构元素的中心点覆盖位置。(寻找结构元素中覆盖目标图像的最小值,赋给结构元素原点位置)

涉及函数:

cv2.erode(src, element, anchor, iterations)

参数说明:

  • 参数1:原图像
  • 参数2:腐蚀操作的内核,默认是一个简单的3x3矩
  • 参数3:默认为Point(-1, -1),内核中心点
  • iterations, 腐蚀次数,默认为1
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("xingtai.png", 1)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# kernel越大腐蚀越厉害
kernel = np.ones((5, 5), np.uint8)
# OpenCV定义的结构元素,cv2.MORP_表示内核
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
erosion = cv2.erode(img, kernel, iterations=1)

plt.subplot(1, 2, 1), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(erosion), plt.title('erosion')
plt.xticks([]), plt.yticks([])
plt.show()

二、图像膨胀 (变胖)

结构元素与目标区域有交集,就保留结构元素的中心点覆盖位置。(寻找结构元素中覆盖目标图像的最大值,赋给结构元素原点位置)

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("xingtai.png",1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# kernel = np.ones((3,3), np.uint8)
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
dilation1 = cv2.dilate(img,kernel1,iterations=1)

kernel2 = np.ones((7,7), np.uint8)
dilation2 = cv2.dilate(img,kernel2,iterations=1)

plt.subplot(1,3,1),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,3,2),plt.imshow(dilation1),plt.title("dilation1")
plt.xticks([]),plt.yticks([])
plt.subplot(1,3,3),plt.imshow(dilation2),plt.title("dilation2")
plt.xticks([]),plt.yticks([])
plt.show()

三、开运算

开运算=先腐蚀运算,再膨胀运算。

总结:

  • 开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不变。
  • 开运算是一个基于几何运算的滤波器。
  • 结构元素大小的不同将导致滤波器效果的不同。
  • 不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("xingtai.png",1)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

# kernel = np.ones((5,5), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(9,9))
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

plt.subplot(1,2,1),plt.imshow(img),plt.title("Original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(opening),plt.title("opening")
plt.xticks([]),plt.yticks([])
plt.show()

  

四、闭运算

闭运算=先膨胀运算,在腐蚀运算。

总结:

  • 比运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
  • 闭运算是通过填充图像的凹角来滤波图像的。
  • 结构元素大小的不同将导致滤波器效果的不同。
  • 不同结构元素的选择导致了不同的分割。
  • 在关闭前景对象内部的小孔或对象上的小黑点时很有用。

 

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("hpc.png",1)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

kernel = np.ones((3,3), np.uint8)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

plt.subplot(1,2,1),plt.imshow(img),plt.title('orginal')
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(closing),plt.title('closing')
plt.xticks([]),plt.yticks([])
plt.show()

五、形态学梯度

基础梯度:用膨胀后的图像减去腐蚀后的图像得到差值图像。

内部梯度:用原图像减去腐蚀之后的图像得到的差值图像。

外部梯度:图像膨胀之后再减去原来的图像得到的差值图像。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("xingtai.png", 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
kernel = np.ones((3, 3), np.uint8)
gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
plt.subplot(1,2,1),plt.imshow(img),plt.title("Original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(gradient),plt.title("gradient")
plt.xticks([]),plt.yticks([])
plt.show()

形态学梯度:这是图像膨胀和腐蚀之间的区别。 结果将看起来像对象的轮廓。

六、顶帽

原图像与开运算图的区别(差值),突出原图像中比周围亮的区域。

# 它是输入图像和图像开运算之差
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("xingtai.png", 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
kernel = np.ones((9, 9), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
plt.subplot(1, 2, 1), plt.imshow(img), plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(tophat), plt.title("Tophat")
plt.xticks([]), plt.yticks([])
plt.show()

七、黑帽

闭运算图像-原图像,突出原图像中比周围暗的区域。

 

# 黑帽: 这是输入图像和图像闭运算之差。
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("xingtai.png", 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
kernel = np.ones((9, 9), np.uint8)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

plt.subplot(1, 2, 1), plt.imshow(img), plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(blackhat), plt.title("Blackhat")
plt.xticks([]), plt.yticks([])
plt.show()

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值