Opencv(C++)学习系列---Sobel索贝尔算子边缘检测-创新互联-成都快上网建站

Opencv(C++)学习系列---Sobel索贝尔算子边缘检测-创新互联

目录

曲麻莱网站建设公司创新互联建站,曲麻莱网站设计制作,有大型网站制作公司丰富经验。已为曲麻莱上千多家提供企业网站建设服务。企业网站搭建\外贸营销网站建设要多少钱,请找那个售后服务好的曲麻莱做网站的公司定做!

【1】算法简介

【2】算子参数介绍

【3】完整代码


【1】算法简介

Sobel算子是一种用于边缘检测的线性滤波器,如果把图像看做是一个二维函数,那么Sobel算子就是图像在垂直和水平方向上变化的速度(即梯度)。Sobel算子在水平和垂直方向上做像素值的差分,能够得到图像梯度的近似值,在像素周围进行运算时,能够减少噪声带来的影响。

其对应的内核函数为:

6a0c3bdbe6704354a2cf6da18b8a0f77.png

Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素;当对精度要求不是很高时,是一种较为常用的边缘检测方法。对于细小边缘检测要求较高的,可以采用scharr算子,它是在sobel算子的基础上进行改进,在不影响检测速度的前提下,提高了边缘检测的精度。

sobel算子和scharr算子他们的卷积核大小是一样的。这意味着他们计算起来,工作量是一样的。

de7e41baabf84dfbac42fa2ad6510297.png

具体算法流程可以参考这篇文章:

https://blog.csdn.net/great_yzl/article/details/119709699?ops_request_misc=&request_id=&biz_id=102&utm_term=opencv%20sobel%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-119709699.nonecase&spm=1018.2226.3001.4187目录一、基础理论二、实战1、对x方向微分2、对y方向微分3、线性混合总代码参考资料一、基础理论Sobel算子:用于边缘检测的离散微分算子。梯度公式:对于图像而言,它是离散的,所以h的最小值只能是1了,那么这意味着,图像中某个像素位置的梯度(以x方向为例)等于它左右两个像素点的像素之差除以2。例:假设有一行像素是这样分布的:123 155 173那么,像素值为155的像素位置x方向的梯度为(173 - 123)/2 = 25Prewit...https://blog.csdn.net/great_yzl/article/details/119709699?ops_request_misc=&request_id=&biz_id=102&utm_term=opencv%20sobel%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-119709699.nonecase&spm=1018.2226.3001.4187

【2】算子参数介绍
cv::Sobel(image, // 输入的图像可以是三通道,也可是单通道
          sobel, // 输出
          image_depth, // 图像类型
          xorder,yorder, // 内核规格
          kernel_size, // 正方形内核的尺寸
          alpha, beta); // 比例和偏移量

参数简介:

输出图像的像素类型是可以选择的:无符号字符型、有符号整数或浮点数。对于sobel算子而言一般选择类型为CV_16S。如果结果超出了像素值域的范围,就会进行饱和度运算,在生成最终图像之前,可以将结果缩放(相乘)alpha倍,并加上偏移量beta。

每个Sobel 掩码都是一个方向上的导数,因此要用两个参数来指明将要应用的内核,即x方向和y 方向导数的阶数。例如,如果xorder和yorder分别为1 和0,则得到水平方向Sobel内核;如果分别是0和1,则得到垂直方向的内核。内核的尺寸也可以大于3×3。可选的尺寸有1、3、5 和7。内核尺寸为1,表示一维Sobel 滤波器(1×3 或3×1)。

【3】完整代码
#include#include#includeusing namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	//载入原始图
	Mat src = imread("E:\\乔大花进度\\11-28\\边缘检测\\3.jpg");
	//【1】创建abs_grad_x,abs_grad_y,dst矩阵;
	Mat grad_x, grad_y;
	Mat abs_grad_x,abs_grad_y,dst;

	//【2】显示原始图
	imshow("原始图",src);

	//【3】求x方向梯度
	Sobel(src,grad_x,CV_16S,1,0,3);
	convertScaleAbs(grad_x,abs_grad_x);

	imshow("x方向sobel",abs_grad_x);

	Scharr(src, grad_y, CV_16S, 0, 1, 9);
	convertScaleAbs(grad_y,abs_grad_y);
	imshow("y方向sobel",abs_grad_y);

	//【5】合并梯度(近似)
	addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,dst);
	cout<< "Sobel输出图像的类型为:"<< dst.type()<< endl;
	cout<< "Sobel输出图像的通道数"<< dst.channels()<< endl;
	imshow("整体效果",dst);

	waitKey(0);
	system("pause");
	destroyAllWindows();

	return 0;

}

运行结果:

e0540586ea55488791819b954c8b1c99.png

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:Opencv(C++)学习系列---Sobel索贝尔算子边缘检测-创新互联
标题URL:http://kswjz.com/article/dscgid.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流