十四、计算机视觉-形态学梯度

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


一、梯度的概念

形态学梯度(Morphological Gradient)是数字图像处理中的一种基本操作,用于检测图像中的边缘和轮廓。它结合了形态学膨胀(Dilation)和形态学腐蚀(Erosion)两种基本操作的结果,从而得到一个图像的边缘信息。


二、梯度的应用

现在有个问题请大家想一下,上面我们提到了梯度可以得到图像的边缘信息,那我们通过前几节的课程想一下 梯度是如何实现的?

例如我现在有个圆,我如何得到圆的边缘?

我如果把这个圆给膨胀一下,这个圆就变大了一圈,我再给腐蚀一下,圆又变小了,如果拿膨胀减去腐蚀的 不就是边缘了吗。

那有人可能又问了:膨胀过后减去原图不也能得到边缘吗,为什么还要在腐蚀一下在减呢?

其实膨胀减去原图也能得到边缘,但是这和膨胀减去腐蚀是有差距的:

当我们将膨胀操作的结果减去原始图像时,实际上得到的是原始图像中比周围更亮的区域。这是因为膨胀操作会扩大图像中较亮的区域,而减去原始图像后,差异部分就是原始图像中相对较亮的区域。因此,这样的操作会突出原始图像中的亮部分,而不是物体的边缘。

对于检测边缘,我们需要考虑的是图像中亮暗交界处的变化,而不仅仅是图像中较亮的区域。形态学梯度通过膨胀和腐蚀操作的差异来捕获这种变化,因为它考虑了物体与背景之间的差异,即使在较暗的物体周围也能有效地检测到边缘。

因此,直接将膨胀操作的结果减去原始图像并不适合用于突出图像的边缘信息,而形态学梯度通过膨胀减去腐蚀来更准确地实现这一目的。

三、梯度如何实现

python 复制代码
import cv2
import numpy as np

# 读取图像
image = cv2.imread('yunfeng.jpg', cv2.IMREAD_GRAYSCALE)

# 定义结构元素
kernel = np.ones((5,5), np.uint8)

# 膨胀操作
dilated = cv2.dilate(image, kernel, iterations=1)

# 腐蚀操作
eroded = cv2.erode(image, kernel, iterations=1)

# 形态学梯度
gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel)

# 显示原始图像、膨胀结果、腐蚀结果和形态学梯度结果
cv2.imshow('Original 、', image)
cv2.imshow('Dilated ', dilated)
cv2.imshow('Eroded ', eroded)
cv2.imshow('Morphological', gradient)

cv2.waitKey(0)
cv2.destroyAllWindows()

上面代码对图像腐蚀和膨胀是为了看对比效果,实际上梯度是通过morphologyEx MORPH_GRADIENT这个参数实现的。

我们看下最终效果:

相关推荐
青松@FasterAI19 分钟前
【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)
人工智能·自然语言处理
AIGC大时代35 分钟前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
硅谷秋水35 分钟前
GAIA-2:用于自动驾驶的可控多视图生成世界模型
人工智能·机器学习·自动驾驶
偶尔微微一笑1 小时前
AI网络渗透kali应用(gptshell)
linux·人工智能·python·自然语言处理·编辑器
深度之眼1 小时前
2025时间序列都有哪些创新点可做——总结篇
人工智能·深度学习·机器学习·时间序列
晓数1 小时前
【硬核干货】JetBrains AI Assistant 干货笔记
人工智能·笔记·jetbrains·ai assistant
jndingxin1 小时前
OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()
人工智能·opencv·计算机视觉
Sherlock Ma2 小时前
PDFMathTranslate:基于LLM的PDF文档翻译及双语对照的工具【使用教程】
人工智能·pytorch·语言模型·pdf·大模型·机器翻译·deepseek
知舟不叙2 小时前
OpenCV中的SIFT特征提取
人工智能·opencv·计算机视觉
kadog2 小时前
PubMed PDF下载 cloudpmc-viewer-pow逆向
前端·javascript·人工智能·爬虫·pdf