概述
canny函数
(1)若某一像素位置的幅值超过高阈值,该像素被保留为边缘像素。
(2)若某一像素位置的幅值小于低阈值,该像素被排除。
(3)若某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。
void Canny(inputArray,outputArray,double threshold1,double threshold2,int apertureSize=3,bool L2gradient=false)
*第一个参数,输入图像,且需为单通道8位图像。
*第二个参数,输出的边缘图。
*第三个参数,第一个滞后性阈值。用于边缘连接。
*第四个参数,第二个滞后性阈值。用于控制强边缘的初始段,高低阈值比在2:1到3:1之间。
*第五个参数,表明应用sobel算子的孔径大小,默认值为3。
*第六个参数,bool类型L2gradient,一个计算图像梯度幅值的标识,默认值false。
sobel函数
void Sobel(inputArray,outputArray,int ddepth,int dx,int dy,int ksize=3,double scale=1,double delta=0,int borderType=BORDER_DEFAULT)
*第一个参数,输入图像。
*第二个参数,输出图像。
*第三个参数,输出图像深度。
*第四个参数,x方向上的差分阶数。
*第五个参数,y方向上的差分阶数。
*第六个参数,Sobel核的大小,默认值为3,必须为1、3、5、7。当为1时,往往使用3x1、1x3的内核,这种情况下,没有进行高斯平滑操作。
*第七个参数,计算导数值时可选的缩放因子,默认值1,表示默认情况下没用应用缩放。
*第八个参数,表示在结果存入输出图像之前可选的delta值,默认值0。
*第九个参数,边界模式。
补充说明:
(1)当内核大小为3时,Sobel内核可能产生比较明显的误差,为了解决这一问题,Opencv提供了Scharr函数,但该函数仅作用于大小为3的内核,该函数的运算与Sobel函数一样快,但结果却更加精确。
(2)因为Sobel算子结合了高斯平滑和分化,因此结果会具有更多的抗噪性。
实例:
Mat x_edgeImg, y_edgeImg;
Mat abs_x_edgeImg, abs_y_edgeImg;
Sobel(tempel_img,x_edgeImg, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(x_edgeImg, abs_x_edgeImg);
Sobel(tempel_img, y_edgeImg, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(y_edgeImg, abs_y_edgeImg);
addWeighted(abs_x_edgeImg, 0.5, abs_y_edgeImg, 0.5, 0, temp_canny_img);
imshow("canny",temp_canny_img);
addWeighted()函数是将两张相同大小,相同类型的图片融合的函数
void addWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst );
参数1:src1,第一个原数组.
参数2:alpha,第一个数组元素权重
参数3:src2第二个原数组
参数4:beta,第二个数组元素权重
参数5:gamma,图1与图2作和后添加的数值。不要太大,不然图片一片白。总和等于255以上就是纯白色了。
参数6:dst,输出图片
最后
以上就是听话老虎为你收集整理的canny函数与sobel函数详解的全部内容,希望文章能够帮你解决canny函数与sobel函数详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复