Marr-Hildreth 边缘检测 OpenCV C++实现

算法原理

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

C++代码实现

Mat MarrEdgeDetection(Mat src, int kernelDiameter, double sigma) {
	int kernel_size = kernelDiameter / 2;
	Mat kernel(kernelDiameter, kernelDiameter, CV_64FC1);
	for (int i = -kernel_size; i <= kernel_size; i++) {
		for (int j = -kernel_size; j <= kernel_size; j++) {
			kernel.at<double>(i + kernel_size, j + kernel_size) = exp(-((pow(j, 2) + pow(i, 2)) /
				(pow(sigma, 2) * 2)))
				* (((pow(j, 2) + pow(i, 2) - 2 *
					pow(sigma, 2)) / (2 * pow(sigma, 4))));
		}
	}
	Mat laplacian(src.rows - kernel_size * 2, src.cols - kernel_size * 2, CV_64FC1);
	Mat dst = Mat::zeros(src.rows - kernel_size * 2, src.cols - kernel_size * 2, CV_8UC1);
	for (int i = kernel_size; i < src.rows - kernel_size; i++) {
		for (int j = kernel_size; j < src.cols - kernel_size; j++) {
			double sum = 0;
			for (int x = -kernel_size; x <= kernel_size; x++){
				for (int y = -kernel_size; y <= kernel_size; y++) {
					sum +=  src.at<uchar>(i + x, j + y) * kernel.at<double>(x + kernel_size, y + kernel_size);
				}
			}
			laplacian.at<double>(i - kernel_size, j - kernel_size) = sum;
		}
	}
	for (int i = 1; i < dst.rows - 1; i++) {
		for (int j = 1; j < dst.cols - 1; j++) {
			if ((laplacian.at<double>(i - 1, j) * laplacian.at<double>(i + 1, j) < 0) || (laplacian.at<double>(i, j + 1) * laplacian.at<double>(i, j - 1) < 0) ||
				(laplacian.at<double>(i + 1, j - 1) * laplacian.at<double>(i - 1, j + 1) < 0) || (laplacian.at<double>(i - 1, j - 1) * laplacian.at <double> (i + 1, j + 1) < 0)) {
				dst.at<uchar>(i, j) = 255;
			}
		}
	}
	return dst;
}
//调用
	Mat src = imread("F:\\1.jpg", 0);
	Mat dst = MarrEdgeDetection(src, 9, 1.6);

效果

原图:
在这里插入图片描述
结果图:
在这里插入图片描述

Marr-Hildreth边缘检测器是一种结合了Canny边缘检测Marr-Hildreth边缘检测的方法。Canny边缘检测是一种常用的边缘检测算法,它通过计算图像灰度的一阶和二阶导数,然后利用非极大值抑制和双阈值处理来确定边缘位置。而Marr-Hildreth边缘检测则是一种基于拉普拉斯滤波的方法,它可以更好地检测出图像中的边缘。 具体的原理是,首先将输入图像进行高斯滤波以平滑图像并去除噪声。然后,对平滑后的图像进行拉普拉斯滤波,得到一个边缘响应图像。接下来,通过寻找图像中的零交叉点,即从正值到负值或从负值到正值的过渡点,来确定边缘的位置。最后,根据设定的阈值进行边缘的提取和连接。 在使用Marr-Hildreth边缘检测器时,需要指定一些参数,如高斯滤波的标准差、阈值和卷积核大小等。这些参数的选择会影响最终的边缘检测结果,需要根据具体的应用场景进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [一种新的Canny+Marr-Hildreth边缘检测器的Matlab代码](https://download.csdn.net/download/weixin_44348719/88251632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [OpenCV边缘检测(七)——Marr-Hildreth边缘检测](https://blog.csdn.net/m0_48748418/article/details/130122096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值