目录
- 一、SUSAN算法
- 二、代码实现
- 三、结果展示
OpenCV——SUSAN边缘检测由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。
一、SUSAN算法
Susan边缘检测是一种经典的边缘检测算,它由Susan Smith于1990年提出。该算法主要用于在图像中检测边缘的位置和方向。
Susan边缘检测算法的基本思想是通过计算像素点与其周围像素点的灰度差异来确定边缘的位置。具体步骤如下:
1、对于图像中的每个像素点,选择一个邻域窗口,通常是一个圆形或者正方形的窗口。
2、在邻域窗口内,计算每个像素点与窗口中心像素点的灰度差异。
3、根据灰度差异的阈值,判断像素点是否为边缘点。如果灰度差异超过阈值,则认为该像素点是边缘点。
4、对于被判定为边缘点的像素,可以进一步计算其边缘方向。
5、Susan边缘检测算法相比其他边缘检测算法具有以下特点:
对噪声具有较好的鲁棒性,能够有效地抑制噪声对边缘检测的影响。可以检测到细线条和曲线等细节信息。算法简单,计算效率较高。
二、代码实现
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
Mat SusanEdgeDetection(Mat& src, int threshold = 100, int radius = 3)
{
Mat dst(src.size(), CV_8UC1, Scalar(0));
for (int i = radius; i < src.rows - radius; i++)
{
for (int j = radius; j < src.cols - radius; j++)
{
int sum = 0;
int count = 0;
int center = src.at<uchar>(i, j);
for (int k = -radius; k <= radius; k++)
{
for (int l = -radius; l <= radius; l++)
{
int val = src.at<uchar>(i + k, j + l);
int diff = abs(val - center);
if (diff <= threshold)
{
sum += diff;
count++;
}
}
}
float susan = 1 - count / (2.0 * radius + 1) / (2.0 * radius + 1);
if (susan > 0.3)
{
dst.at<uchar>(i, j) = 255;
}
}
}
return dst;
}
int main()
{
Mat src = imread("susan.png", IMREAD_GRAYSCALE);
if (src.empty())
{
cout << "Could not open or find the image!\n" << endl;
return -1;
}
Mat dst = SusanEdgeDetection(src);
imshow("原始图像", src);
imshow("SUSAN边缘检测", dst);
waitKey(0);
return 0;
}