> 文章列表 > 【Python_Opencv图像处理框架】图像形态学操作

【Python_Opencv图像处理框架】图像形态学操作

【Python_Opencv图像处理框架】图像形态学操作

写在前面

本篇文章是opencv学习的第三篇文章,主要讲解了图像的形态学有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️


写在中间

读完这篇文章后,相信您便能信手拈来下面图片的效果。

在这里插入图片描述

一、腐蚀操作

( 1 )简单介绍

在图像处理中,腐蚀(Erosion)是一种常见的形态学操作,它可以将图像中的细节部分缩小或者消失。简单来说就是将图像中的毛刺腐蚀掉。

( 2 )操作实现

cv2.erode(img, kernel, iterations) 其他参数暂省略

img是输入图像

kernel是腐蚀操作的核,表示每个像素点周围的像素点的位置和权重

iterations是操作的次数

( 3 )代码示例

假设我们有一张二值化图像,我们可以通过以下代码实现一次腐蚀操作:

import cv2
import numpy as np
img = cv2.imread('image.png', 0)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示在这里插入图片描述

二、膨胀操作

( 1 )简单介绍

膨胀(Dilation)是与腐蚀相反的形态学操作,它可以使图像中的细节部分增大或者扩张。在图像处理中,膨胀操作可以用来连接断开的元素、消除小的空洞或者孔洞等。

( 2 )操作实现

cv2.dilate(img, kernel, iterations)

img是输入图像,

kernel是膨胀操作的核,表示每个像素点周围的像素点的位置和权重

iterations是操作的次数,

( 3 )代码示例

同样是假设我们有一张二值化图像,我们可以通过以下代码实现膨胀操作:

import cv2
import numpy as npimg = cv2.imread('image.png', 0)
kernel = np.ones((3, 3), dtype=np.uint8)
dilate = cv2.dilate(img, kernel, 2)  # 2为迭代次数,也就是执行2次膨胀操作plt.imshow(dilate)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

在这里插入图片描述


三、开运算与闭运算

( 1 )简单介绍

仔细观察上面的图片,就会发现腐蚀操作虽然去除了毛刺,但使原始的线条变细
除了单独的腐蚀和膨胀操作,还可以通过它们的组合来实现更为复杂的形态学操作。其中,开运算和闭运算是两种常见的组合形态学操作,它们可以用来去噪声、消除空洞等一系列操作。下面,我们分别来介绍一下这两个操作。

开运算:先腐蚀,再膨胀

闭运算:先膨胀,再腐蚀

( 2 )操作实现

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

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

img是输入图像
cv2.MORPH_OPEN是一个常量,代表开运算,是指将一个图像先进行腐蚀操作,然后再进行膨胀操作;
cv2.MORPH_CLOSE是一个常量,代表闭运算,是指将一个图像先进行膨胀操作,然后再进行腐蚀操作;
kernel是一个结构元素,用于定义形态学操作的形状和大小

( 3 )代码示例

# 开运算
img = cv2.imread("D:\\python\\Program\\pythonProject\\photos\\csdn.png")
kernel = np.ones((5, 5), np.uint8)opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)plt.imshow(opening)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()# 闭运算
img = cv2.imread("D:\\python\\Program\\pythonProject\\photos\\csdn.png")
kernel = np.ones((5, 5), np.uint8)closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)plt.imshow(closing)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

开运算

在这里插入图片描述

闭运算

在这里插入图片描述


四、梯度计算

( 1 )简单介绍

梯度运算就是用膨胀的图像减去腐蚀的图像,就可以获得原图像的边缘信息(梯度信息)。简言之,就是梯度=膨胀-腐蚀

( 2 )操作实现

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel_gradient, iterations=1)

img是输入图像

cv2.MORPH_GRADIENT表示要进行的形态学操作类型,这里是梯度操作

kernel是一个结构元素,用于定义形态学操作的形状和大小

iterations=1:形态学操作的迭代次数,用于指定重复执行操作的次数。在这里,梯度操作只执行一次,因此该参数的值为1

( 3 )代码示例

img = cv2.imread("D:\\python\\Program\\pythonProject\\photos\\csdn.png")
kernel = np.ones((7, 7), np.uint8)gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)plt.imshow(gradient)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示
在这里插入图片描述


五、礼帽与黑帽

( 1 )简单介绍

礼帽=原始输入-开运算结果
黑帽=闭运算-原始输入

( 2 )操作实现

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

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

( 3 )代码示例

# 礼帽运算
img = cv2.imread("D:\\python\\Program\\pythonProject\\photos\\csdn.png")
kernel = np.ones((7, 7), np.uint8)tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
plt.imshow(tophat)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()# 黑帽运算
img = cv2.imread("D:\\python\\Program\\pythonProject\\photos\\csdn.png")
kernel = np.ones((7, 7), np.uint8)blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
plt.imshow(blackhat)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

礼帽:

在这里插入图片描述

黑帽:
在这里插入图片描述


写在最后

👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!