OpenCV边缘检测(七)——Marr-Hildreth边缘检测

以下是使用C++实现Marr-Hildreth边缘检测的示例代码: int main(){// 读入图像Mat image = imread("lena.j

以下是使用C++实现Marr-Hildreth边缘检测的示例代码:

int main()
{// 读入图像Mat image = imread("lena.jpg", IMREAD_GRAYSCALE);if (image.empty()) {cout << "Can't open image" << endl;return -1;}// 高斯滤波Mat smoothed;GaussianBlur(image, smoothed, Size(3, 3), 0);// 拉普拉斯滤波Mat laplacian;Laplacian(smoothed, laplacian, CV_32F);// Marr-Hildreth算法double sigma = 1.0;double threshold = 0.05;int kernel_size = 5;Mat edges;for (int i = kernel_size; i < laplacian.rows - kernel_size; i++) {for (int j = kernel_size; j < laplacian.cols - kernel_size; j++) {double sum = 0.0;for (int m = -kernel_size; m <= kernel_size; m++) {for (int n = -kernel_size; n <= kernel_size; n++) {sum += pow(laplacian.at(i + m, j + n), 2.0) * exp(-(pow(m, 2.0) + pow(n, 2.0)) / (2.0 * pow(sigma, 2.0)));}}edges.at(i, j) = sum > threshold ? 255 : 0;}}// 显示结果namedWindow("Original Image", WINDOW_NORMAL);imshow("Original Image", image);namedWindow("Edges", WINDOW_NORMAL);imshow("Edges", edges);waitKey(0);return 0;
}

在上述代码中,我们首先读入一个灰度图像,然后对其进行高斯滤波和拉普拉斯滤波操作。接着,我们使用Marr-Hildreth算法对拉普拉斯滤波后的图像进行边缘检测。最后,我们显示原始图像和检测到的边缘图像。

需要注意的是,在使用Marr-Hildreth算法进行边缘检测时,我们需要指定一些参数,如高斯滤波的标准差、阈值和卷积核大小等。这些参数的值会影响最终的边缘检测结果,需要根据具体的应用场景进行调整。