opencv学习-常用算子

38 篇文章 1 订阅

在图像中,边界位置才会有梯度,opencv中的常见算子有:

1、Sobel算子

可以有效的提取图像边缘,但是对图像中较弱的边缘提取效果较差
在这里插入图片描述

int main()
{
	cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\1.jpeg", IMREAD_GRAYSCALE);

	cv::imshow("img", img);

	cv::Mat img_sobel;
	cv::Sobel(img, img_sobel, CV_64F, 1, 0, 3);
	cv::Mat img_sobelx;
	cv::convertScaleAbs(img_sobel, img_sobelx);

	cv::imshow("soblex", img_sobelx);

	cv::Sobel(img, img_sobel, CV_64F, 0, 1, 3);
	cv::Mat img_sobely;
	cv::convertScaleAbs(img_sobel, img_sobely);

	cv::imshow("sobley", img_sobely);

	cv::Mat img_sobelxy;
	cv::addWeighted(img_sobelx, 0.5, img_sobely, 0.5, 0, img_sobelxy);
	cv::imshow("soblexy", img_sobelxy);

	cv::waitKey(0);

	return 0;
}

在这里插入图片描述

2、scharr算子

Scharr算子是对Sobel算子差异性的增强,是通过将滤波器中的权重系数放大来增大像素值间的差异,能有效的提取出较弱的边缘,但两者在检测图像边缘的原理和使用方式上相同
在这里插入图片描述

int main()
{
	cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\1.jpeg", IMREAD_GRAYSCALE);

	cv::imshow("img", img);

	cv::Mat img_sobel;
	//cv::Sobel(img, img_sobel, CV_64F, 1, 0, 3);
	cv::Scharr(img, img_sobel, CV_64F, 1, 0, 3);
	cv::Mat img_sobelx;
	cv::convertScaleAbs(img_sobel, img_sobelx);

	cv::imshow("soblex", img_sobelx);

	//cv::Sobel(img, img_sobel, CV_64F, 0, 1, 3);
	cv::Scharr(img, img_sobel, CV_64F, 0, 1, 3);
	cv::Mat img_sobely;
	cv::convertScaleAbs(img_sobel, img_sobely);

	cv::imshow("sobley", img_sobely);

	cv::Mat img_sobelxy;
	cv::addWeighted(img_sobelx, 0.5, img_sobely, 0.5, 0, img_sobelxy);
	cv::imshow("soblexy", img_sobelxy);

	cv::waitKey(0);

	return 0;
}

在这里插入图片描述

3、Laplacian算子

1)Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,因此使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。
2)Laplacian算子是一种二阶导数算子,对噪声比较敏感,所以需要配合配合高斯滤波一起使用

在这里插入图片描述

int main()
{
	cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\1.jpeg", IMREAD_GRAYSCALE);

	cv::imshow("img", img);
	
	cv::Mat img_laplacian;
	cv::Laplacian(img, img_laplacian, CV_64F, 3);
	cv::convertScaleAbs(img_laplacian, img_laplacian);
	cv::imshow("laplacian", img_laplacian);

	cv::waitKey(0);

	return 0;
}

在这里插入图片描述

Canny边缘检测

Canny边缘检测算法 是 John F. Canny 于1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的最优算法,最优边缘检测的三个主要评价标准是:

1、低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。

2、高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。

3、最小响应: 图像中的边缘只能标识一次。

Canny边缘检测的一般步骤:

去噪:边缘检测容易受到噪声影响,在进行边缘检测前通常需要先进行去噪,一般用高斯滤波去除噪声。
计算梯度:对平滑后的图像采用Sobel算子计算梯度和方向。
在这里插入图片描述

计算出来的梯度和方向大概如下图:
在这里插入图片描述
非极大值抑制(NMS)
在获取了梯度和方向之后,遍历图像,去除所有不是边界的点。
实现方法:逐个遍历像素点,判断当前像素点是否是周围像素点中具有相同方向梯度的最大值。
下图中,点A,B,C具有相同的方向,梯度方向垂直于边缘。
判断点A是否为A,B,C中的局部最大值,如果是,保留该点;否则,它被抑制(归零)。
在这里插入图片描述
更形象例子:
在这里插入图片描述
滞后阈值
在这里插入图片描述

int main()
{
	cv::Mat img = cv::imread("C:\\Users\\Administrator\\Downloads\\26.jpg", IMREAD_GRAYSCALE);

	cv::imshow("img", img);
	cv::Mat edge;

	cv::Canny(img, edge, 100, 200);
	cv::imshow("edge1", edge);

	cv::Canny(img, edge, 64, 128);
	cv::imshow("edge2", edge);
	
	cv::Canny(img, edge, 80, 150);
	cv::imshow("edge3", edge);

	cv::waitKey(0);

	return 0;
}

在这里插入图片描述

参考原文链接:
https://blog.csdn.net/onroadliuyaqiong/article/details/121929934
https://blog.csdn.net/qq_44808827/article/details/121214287

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值