Python机器视觉--OpenCV进阶(核心)--形态学概述与图像的腐蚀,膨胀操作与自动获取形态学卷积核

1.图像的腐蚀,膨胀操作与自动获取形态学卷积核

1.1 形态学概述

  • 什么是形态学
    • 指一系列处理图像形状特征的图像处理技术
    • 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
    • 这些处理方法基本是对二进制图像进行处理, 即黑白图像
    • 卷积核决定着图像处理后的效果
    • 形态学常用基本操作有:
      • 膨胀和腐蚀
      • 开运算
      • 闭运算
      • 顶帽
      • 黑帽

1.2 腐蚀操作

腐蚀操作类似于将图像进行缩边

  • 腐蚀操作也是用卷积核扫描图像, 只不过腐蚀操作的卷积和一般都是1, 如果卷积核内所有像素点都是白色, 那么锚点即为白色.

  • 大部分时候腐蚀操作使用的都是全为1的卷积核.

  • erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

    • iterations是腐蚀操作的迭代次数, 次数越多, 腐蚀操作执行的次数越多, 腐蚀效果越明显

代码实现

#读取图片
img= cv2.imread('./code/j2.png')

#定义腐蚀操作 卷积核
kernel=np.ones((5,5),np.uint8)

#进行腐蚀操作
dst=cv2.erode(img,kernel,iterations=1)

cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图所示 左侧为腐蚀前,右侧为腐蚀后

在这里插入图片描述

1.3 自动获取形态学卷积核

上面的腐蚀操作中,我们自行创建了一个5*5 的全1卷积核,但是遇到复杂的图像操作时,我们不可能每次都自行指定卷积核,因此opencv提供了获取卷积核的api.不需要我们手工创建卷积核.

  • getStructuringElement(shape, ksize[, anchor])
    • shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.
      • MORPH_RECT 卷积核中的1是矩形, 常用.
      • MORPH_ELLIPSE 椭圆
      • MORPH_CROSS 十字

自动获取卷积核的实现与个形状卷积核对比


#读取图片
import numpy as np
import cv2
img= cv2.imread('./j2.png')

#自动获取卷积核
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

kerne2=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))

kerne3=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

#进行腐蚀操作
dst=cv2.erode(img,kernel,iterations=1)
dst2=cv2.erode(img,kerne2,iterations=1)
dst3=cv2.erode(img,kerne3,iterations=1)

cv2.imshow('img',np.hstack((img,dst,dst2,dst3)))
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下

图片中卷积核的顺序依次为 原图,MORPH_RECT(矩形卷积核),MORPH_ELLIPSE(椭圆卷积核),MORPH_CROSS(十字卷积核)

在这里插入图片描述

1.4 膨胀操作

膨胀操作类似对图像进行扩边

膨胀是腐蚀的相反操作, 基本原理是只要保证卷积核的锚点是非0值, 周边无论是0还是非0值, 都变成非0值.

  • dilate(img, kernel, iterations=1)

代码实现

import cv2
import numpy as np

img = cv2.imread('./j.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.dilate(img, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

效果如图

在这里插入图片描述

腐蚀与膨胀操作 对比


#读取图片
img= cv2.imread('./j.png')

#自动获取卷积核
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# 进行腐蚀操作
dst1=cv2.erode(img,kernel,iterations=1)

#进行膨胀操作
dst2=cv2.dilate(img,kernel,iterations=1)

cv2.imshow('img',np.hstack((img,dst1,dst2)))
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43944517/article/details/126570335