OPENCV(python)--初学之路(六)
一前言
今天依旧不是很舒服但是还是学习,今天算是正常更新,大家一起努力吧!
二主要内容--形态转换
为了大家能更直观看到效果,我会把运行结果截图放上来,。

这幅图是原图示例
1腐蚀
腐蚀的基本概念就像土壤侵蚀一样,只侵蚀前景对象的边界(总是尽量保持前景为白色)。那它有什么作用呢?内核在图像中滑动(如二维卷积)。只有当内核下的所有像素都为 1 时,原始图像中的像素(1 或 0)才会被视为 1,否则会被侵蚀(变为零)。
所以根据内核的大小,边界附近的所有像素都将被丢弃。因此,前景对象的厚度或大小在图像中减少或只是白色区域减少。它有助于消除小的白色噪音(如我们在“颜色空间”一章中所看到的),分离两个连接的对象等。
cv.erode() 是 OpenCV 中的腐蚀函数,用于形态学图像处理
eroded = cv.erode(src, kernel, iterations=1)
参数介绍:
-
src: 输入图像(通常是二值图像) -
kernel: 结构元素(卷积核) -
iterations: 腐蚀操作的迭代次数(默认1次)
作为一个例子,我将使用一个 5x5 内核,内核元素均为1。让我们看看它是如何工作的
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 读取图像文件
img = cv.imread('test.jpg')
# 应用5x5均值模糊
blur = cv.blur(img, (5,5))
# 创建1行2列的子图布局
plt.subplot(121)
plt.imshow(img)
plt.title('Original')
plt.xticks([]), plt.yticks([]) # 隐藏坐标轴刻度
plt.subplot(122)
plt.imshow(blur)
plt.title('Blurred')
plt.xticks([]), plt.yticks([])
# 显示图像对比
plt.show()

2膨胀
它与腐蚀正好相反。这里,如果内核下至少有一个像素为“1”,则像素元素为“1”。所以它会增加图像中的白色区域,或者增加前景对象的大小。通常情况下,在去除噪音的情况下,腐蚀后会膨胀。因为,腐蚀消除了白噪声,但它也缩小了我们的对象。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的目标区域会增加到腐蚀之前的状态。它还可用于连接对象的断开部分
膨胀函数与腐蚀函数相对
dilation = cv.dilate(src, kernel, iterations=1)
参数说明:
-
src: 输入图像(通常是二值图像) -
kernel: 结构元素(卷积核) -
iterations: 膨胀操作的迭代次数(默认1次)
代码如下:
img = cv.imread('open.jpg')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
_, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
kernel = np.ones((5,5), np.uint8)
erosion = cv.erode(binary, kernel, iterations=1)
dilation = cv.dilate(binary, kernel, iterations=1)
plt.figure(figsize=(12,4))
plt.subplot(141), plt.imshow(binary, cmap='gray')
plt.title('Original Binary'), plt.xticks([]), plt.yticks([])
plt.subplot(142), plt.imshow(erosion, cmap='gray')
plt.title('Erosion'), plt.xticks([]), plt.yticks([])
plt.subplot(143), plt.imshow(dilation, cmap='gray')
plt.title('Dilation'), plt.xticks([]), plt.yticks([])
plt.show()
结果对比:

腐蚀 vs 膨胀的效果:
-
腐蚀 (Erosion):
-
缩小白色区域
-
消除小的白色噪点
-
分离相连的物体
-
-
膨胀 (Dilation):
-
扩大白色区域
-
填充小的黑色空洞
-
连接相近的物体
-
3cv.morphologyEx()系列
开只是腐蚀的另一个名称,随后是膨胀。正如我们上面所解释的,它对消除噪音很有用。在这里,我们使用 cv.morphologyEx()。(此函数较为重要,后续几个内容将围绕它来讲,做好准备)
result = cv.morphologyEx(src, op, kernel, iterations=1)
参数说明:
-
src: 输入图像 -
op: 形态学操作类型 -
kernel: 结构元素 -
iterations: 操作迭代次数
1.开运算
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
效果: 先腐蚀后膨胀
用途: 去除小的白色噪点,平滑轮廓
2闭运算
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
效果: 先膨胀后腐蚀
用途: 填充小的黑色空洞,连接断开的区域
3形态梯度
它是图像的膨胀和腐蚀之间的差值。
结果将类似于对象的轮廓。
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
效果: 膨胀结果减去腐蚀结果
用途: 获取物体边缘
4顶帽运算
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
效果: 原图减去开运算结果
用途: 提取亮色的微小细节
5黑帽运算
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
效果: 闭运算结果减去原图
用途: 提取暗色的微小细节
五种效果的代码如下:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 图像读取与预处理
img = cv.imread('open.jpg')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
# 二值化处理
_, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
# 创建形态学核
kernel_rect = cv.getStructuringElement(cv.MORPH_RECT, (5,5))
kernel_ellipse = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5,5))
kernel_cross = cv.getStructuringElement(cv.MORPH_CROSS, (5,5))
# 形态学操作应用
opening = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel_rect)
closing = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel_rect)
gradient = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel_rect)
tophat = cv.morphologyEx(binary, cv.MORPH_TOPHAT, kernel_rect)
# 结果可视化
plt.figure(figsize=(15,10))
plt.subplot(231), plt.imshow(binary, cmap='gray')
plt.title('Original Binary'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(opening, cmap='gray')
plt.title('Opening'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(closing, cmap='gray')
plt.title('Closing'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(gradient, cmap='gray')
plt.title('Gradient'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(tophat, cmap='gray')
plt.title('Top Hat'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()
效果对比图

三最后一语
今天主要是学了腐蚀与膨胀,后面的其实与这两个没太大的区别,大家都要运行一下,并试试改变值让效果更明显。
我们奋力向前,却如逆水行舟,不断退后,回到往昔岁月--《了不起的盖茨比》
感谢观看,共勉!!
更多推荐



所有评论(0)