自学内容网 自学内容网

8.7基于数学形态学的边缘检测

基本概念

数学形态学(Mathematical Morphology)是一套用于图像处理的技术,它包括膨胀(Dilation)、腐蚀(Erosion)、开运算(Opening)和闭运算(Closing)等操作。通过组合这些基本操作,可以实现复杂的图像处理任务,比如边缘检测。

边缘检测可以通过形态学梯度(Morphological Gradient)来实现,形态学梯度定义为膨胀图像与原图像(或腐蚀图像)之间的差值。这种技术可以有效地突出边缘区域,因为边缘通常是图像中亮度突变的地方。

示例代码

下面是一个使用OpenCV和C++来实现基于数学形态学的边缘检测的示例代码:

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
// 加载图像
cv::Mat src = cv::imread("07.png", cv::IMREAD_GRAYSCALE);
if (src.empty())
{
std::cout << "Error: Image not found or unable to open" << std::endl;
return -1;
}

// 定义结构元素
int elementShape = cv::MORPH_RECT; // 可以选择cv::MORPH_ELLIPSE或cv::MORPH_CROSS
int kernelSize = 3; // 核大小
cv::Mat element = cv::getStructuringElement(elementShape,
cv::Size(2 * kernelSize + 1, 2 * kernelSize + 1),
cv::Point(kernelSize, kernelSize));

// 执行膨胀操作
cv::Mat dilated;
cv::dilate(src, dilated, element);

// 计算形态学梯度
cv::Mat gradient;
cv::subtract(dilated, src, gradient);

// 二值化结果
cv::Mat binary;
cv::threshold(gradient, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);

// 显示原始图像和边缘检测结果
cv::namedWindow("Original Image", CV_WINDOW_NORMAL);
cv::imshow("Original Image", src);
cv::namedWindow("Edge Detection Result", CV_WINDOW_NORMAL);
cv::imshow("Edge Detection Result", binary);
cv::waitKey(0);

return 0;
}


在这段代码中:
我们加载了一张灰度图像。
定义了一个结构元素(内核),该内核用于执行膨胀操作。
对图像执行膨胀操作。
使用cv::subtract函数计算膨胀后的图像与原图之间的差值,即形态学梯度。
使用大津法(Otsu's thresholding)自动确定阈值来二值化形态学梯度的结果。
最后,我们显示原始图像和边缘检测结果。
记得将 "path_to_your_image.jpg" 替换为你实际要处理的图像文件路径。此外,你还可以通过调整结构元素的形状和大小来优化边缘检测的效果。

运行结果


原文地址:https://blog.csdn.net/weixin_45794330/article/details/141969413

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!