OpenCV——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;
}

三、结果展示

在这里插入图片描述

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Susan算子是用于边缘检测的一种算法,它可以检测圆形、椭圆形和线性边缘,其基本思想是通过计算像素点与其周围邻居像素的灰度差异,来判断该像素点是否为边缘点。在OpenCV中,可以使用susan算子进行边缘检测,具体步骤如下: 1. 读取图像,并将其转换为灰度图像。 2. 对图像进行滤波处理,以去除噪声。 3. 计算每个像素点与其周围邻居像素的灰度差异,得到一个susan值。 4. 对susan值进行阈值处理,将大于等于阈值的像素点标记为边缘点。 5. 可以对标记的边缘点进行连接,形成一条完整的边缘线。 下面是一段使用OpenCV实现susan算子边缘检测的示例代码: ``` python import cv2 # 读取图像 img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 进行滤波处理 blur = cv2.GaussianBlur(img, (5, 5), 0) # 计算susansusan = cv2.cornerHarris(blur, 3, 3, 0.04) # 对susan值进行阈值处理,标记边缘点 threshold = 0.01 * susan.max() edge_img = img.copy() edge_img[susan > threshold] = 255 edge_img[susan <= threshold] = 0 # 显示结果图像 cv2.imshow('Edge Detection', edge_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 其中,`cv2.cornerHarris()`函数用于计算susan值,第一个参数为输入图像,第二个参数为邻域大小,第三个参数为susan算子的k值,第四个参数为susan算子的自适应阈值。最后,通过对susan值进行阈值处理,将大于等于阈值的像素点标记为边缘点,并显示结果图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值