OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3
 4 using namespace cv;
 5 using namespace std;
 6
 7
 8 int main(int argc, char** argv)
 9 {
10     Mat src = imread("test.jpg");
11     Mat dst, gray,grad_x, gray_y,abs_grad_x,abs_grad_y;
12
13
14     //转成灰度图
15     cvtColor(src, gray, COLOR_BGR2GRAY);
16
17     //均值滤波降噪,也可以用其他滤波方法
18     blur(gray, src, Size(3, 3));
19
20     //运行Sobel算子,得到边缘
21     //求x方向梯度
22     Sobel(src, grad_x, CV_16S, 1, 0, 3);
23     convertScaleAbs(grad_x, abs_grad_x);//提取的深度图片进行显示时,由于是16位图片,要将图片转化成为8位图形进行显示
24     imshow("x方向的sobel", abs_grad_x);
25
26     //运行Sobel算子,得到边缘
27     //求y方向梯度
28     Sobel(src, gray_y, CV_16S, 0, 1, 3);
29     convertScaleAbs(gray_y, abs_grad_y);
30     imshow("y方向的sobel", abs_grad_y);
31
32     //合并梯度
33     addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
34
35
36     imshow("合成的整体效果图", dst);
37
38     waitKey(0);
39     return 0;
40
41 }

 convertScaleAbs函数
线性变换转换输入数组元素成8位无符号整型。
void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)
参数 :
src – 输入数组。
dst – 输出数组。
alpha – 可选缩放比例常数。
beta – 可选叠加到结果的常数。
对于每个输入数组的元素函数convertScaleAbs 进行三次操作依次是:缩放,得到一个绝对值,转换成无符号8位类型。
对于多通道矩阵,该函数对各通道独立处理。如果输出不是8位,将调用Mat::convertTo 方法并计算结果的绝对值。

addWeighted函数
计算两个矩阵的加权和。
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, intdtype=-1)
参数 
src1 – 第一个输入数组。
alpha – 第一个数组的加权系数。
src2 – 第二个输入数组,必须和第一个数组拥有相同的大小和通道。
beta – 第二个数组的加权系数。
dst – 输出数组,和第一个数组拥有相同的大小和通道。
gamma – 对所有和的叠加的常量。
dtype – 输出数组中的可选的深度,当两个数组具有相同的深度,此系数可设为-1,意义等同于选择与第一个数组相同的深度。
在多通道情况下,每个通道是独立处理的,该函数可以被替换成一个函数表达式:
dst = src1*alpha + src2*beta + gamma;

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3
 4 using namespace cv;
 5 using namespace std;
 6
 7
 8 int main(int argc, char** argv)
 9 {
10     Mat src = imread("test.jpg");
11     Mat dst, gray;
12
13     //滤波降噪
14     GaussianBlur(src, src, Size(3, 3),0,0,BORDER_DEFAULT);
15
16     //转成灰度图
17     cvtColor(src, gray, COLOR_BGR2GRAY);
18
19     //运行Sobel算子,得到边缘
20     //求x方向梯度
21     //Laplacian(src, dst, CV_16S, 3, 1,0,BORDER_DEFAULT);
22     Laplacian(src, dst, CV_16S);//后几个参数有默认值
23
24     //由于是16位图片,需要将图片转化成为8位图形进行显示
25     convertScaleAbs(dst, dst);
26
27     imshow("效果图", dst);
28
29     waitKey(0);
30     return 0;
31
32 }

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3
 4 using namespace cv;
 5 using namespace std;
 6
 7
 8 int main(int argc, char** argv)
 9 {
10     Mat src = imread("test.jpg");
11     Mat dst, gray,grad_x, grad_y,abs_grad_x,abs_grad_y;
12
13
14     //转成灰度图(sobel和scharr可以不用转换成灰度图)
15     cvtColor(src, gray, COLOR_BGR2GRAY);
16
17     //均值滤波降噪,也可以用其他滤波方法
18     blur(gray, src, Size(3, 3));
19
20     //运行Sobel算子,得到边缘
21     //求x方向梯度
22     Scharr(src, grad_x, CV_16S, 1, 0);
23     convertScaleAbs(grad_x, abs_grad_x);//提取的深度图片进行显示时,由于是16位图片,想将图片转化成为8位图形进行显示
24     imshow("x方向的Scharr", abs_grad_x);
25
26     //运行Sobel算子,得到边缘
27     //求y方向梯度
28     Scharr(src, grad_y, CV_16S, 0, 1);
29     convertScaleAbs(grad_y, abs_grad_y);
30     imshow("y方向的Scharr", abs_grad_y);
31
32     //合并梯度
33     addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
34
35
36     imshow("合成的整体效果图", dst);
37
38     waitKey(0);
39     return 0;
40
41 }

原文地址:https://www.cnblogs.com/long5683/p/9675691.html

时间: 2024-08-06 13:09:02

OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)的相关文章

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们将一起学习OpenCV中

【opencv入门之九】Opencv边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

参考网站: http://blog.csdn.net/poem_qianmo/article/details/25560901 1.边缘检测步骤 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感.( 通常用高斯滤波 ) 2)增强:增强边缘的基础是确定图像各点领域强度的变化值.增强算法可以将图像灰度点领域强度值有显著变化的点凸显出来.( 可以通过计算梯度幅值来确定 ) 3)检测:经过增强的图像,往往领域中有很多点的梯度值比较大,而特定的应用中,这些点并不是我们要找

学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器--Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码.在介绍四块知识点的时候分别一个,以及最后的综合示例中的一个.文章末尾提供配套源代码的下载. **** 给大家分享一个OpenCv中写代码是节约时间的小常识.其实OpenCv中,不用nameWindow,直接imshow就可以显示出窗口.大家看下文的示例代码就可以发现,浅墨在写代码的时候并没有用na

图像边缘检测——Sobel算子

边缘是图像最基本的特征,其在计算机视觉.图像分析等应用中起着重要的作用,这是因为图像的边缘包含了用于识别的有用信息,是图像分析和模式识别的主要特征提取手段. 1.何为“图像边缘”? 在图像中,“边缘”指的是临界的意思.一幅图像的“临界”表示为图像上亮度显著变化的地方,边缘指的是一个区域的结束,也是另一个区域的开始.“边缘点”指的是图像中具有坐标[x,y],且处在强度显著变化的位置上的点. 2.如何表示边缘检测? 在数学上,用导数来表示改变的快慢.基于此,有许多方法用于边缘检测,他们绝大部分可以划

OpenCV使用Sobel滤波器实现图像边缘检测

纯粹阅读,请移步OpenCV使用Sobel滤波器实现图像边缘检测 效果图 源码 KqwOpenCVFeaturesDemo Sobel滤波器也叫Sobel算子,与Canny边缘检测一样,需要计算像素的灰度梯度,只不过是换用另一种方式. 使用Sobel算子计算边缘的步骤 将图像转为灰度图像 // 原图置灰 Imgproc.cvtColor(src, grayMat, Imgproc.COLOR_BGR2GRAY); 计算水平方向灰度梯度的绝对值 Imgproc.Sobel(grayMat, gra

[ZZ] 边缘检测 梯度与Roberts、Prewitt、Sobel、Lapacian算子

http://blog.csdn.net/swj110119/article/details/51777422 一.学习心得: 学习图像处理的过程中,刚开始遇到图像梯度和一些算子的概念,这两者到底是什么关系,又有什么不同,一直困扰着我.后来在看到图像分割这一模块后才恍然大悟,其实图像的梯度可以用一阶导数和二阶偏导数来求解.但是图像以矩阵的形式存储的,不能像数学理论中对直线或者曲线求导一样,对一幅图像的求导相当于对一个平面.曲面求导.对图像的操作,我们采用模板对原图像进行卷积运算,从而达到我们想要

OpenCV2马拉松第14圈——边缘检测(Sobel,prewitt,roberts)

收入囊中 差分在边缘检测的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检测到底有什么用呢?先看下面的图片 作为人,我们可以很容易发现图中红圈有边界,边界处肯定是非常明显,变化陡峭的,在数学中,什么可以表示变化的快慢,自然就是导数,微分了. 想像有如下的一维图片. 红圈处变化最陡峭,再看导数图 红圈在最高值,也就是导数可以很好表示边缘,因为变化很剧烈 图像中的Sobel算子 是离散差分算子. 结合了

【OpenCV】边缘检测:Sobel、拉普拉斯算子

推荐博文,博客. Reference Link : http://blog.csdn.net/xiaowei_cqu/article/details/7829481

OpenCV探索之路(六):边缘检测(canny、sobel、laplacian)

边缘检测的一般步骤: 滤波--消除噪声 增强--使边界轮廓更加明显 检测--选出边缘点 Canny算法 Canny边缘检测算法被很多人推崇为当今最优秀的边缘检测算法,所以我们第一个就介绍他. opencv中提供了Canny函数. #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; //边缘检测 int main() {