Opencv2.4学习::边缘检测(2)Sobel算子

边缘检测

1、Sobel

2、

3、

4、


Sobel


 核心函数:

void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3,double scale=1, double delta=0,int borderType=BORDER_DEFAULT );
  • InputArray 类型的src,为输入图像,填Mat类型即可。
  • OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
  • int类型的ddepth,输出图像的深度,支持如下src.depth()和ddepth的组合:
  • 若src.depth() = CV_8U, 取ddepth =-1或CV_16S或CV_32F或CV_64F
  • 若src.depth() = CV_16U/CV_16S, 取ddepth =-1或CV_32F或CV_64F
  • 若src.depth() = CV_32F, 取ddepth =-1或CV_32F或CV_64F
  • 若src.depth() = CV_64F, 取ddepth = -1或CV_64F
  • int类型dx,x方向上的差分阶数。 (官方文档上也是这么说的,但是你看最后的结果明显是y方向上的差分阶数才对啊)
  • int类型dy,y方向上的差分阶数。 (官方文档上也是这么说的,但是你看最后的结果明显是x方向上的差分阶数才对啊)
  • int类型ksize,有默认值3,表示Sobel核的大小;必须取1,3,5或7。
  • double类型的scale,计算导数值时可选的缩放因子,默认值是1,表示默认情况下是没有应用缩放的。我们可以在文档中查阅getDerivKernels的相关介绍,来得到这个参数的更多信息。
  • double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。【具体这个值有什么作用,我还不清楚】
  • int类型的borderType,我们的老朋友了(万年是最后一个参数),边界模式,默认值为BORDER_DEFAULT。这个参数我在前面的博文(http://blog.csdn.net/wenhao_ir/article/details/51699064)中已经讲过,这里不再赘述了! 

调用代码:

#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void main()
{
	Mat srcImage = imread("F:\\opencv_re_learn\\2.jpg");
	if (!srcImage.data){
		cout << "falied to read" << endl;
		system("pause");
		return;
	}
	imshow("srcImage", srcImage);
	Mat blurImage;
	blur(srcImage, blurImage, Size(3, 3));
	Mat srcGray;
	cvtColor(blurImage, srcGray, CV_BGR2GRAY);
	//定义边缘图,水平方向和垂直方向的
	Mat edgeMat, edgeXMat, edgeYMat;
	//求x方向的Sobel边缘
	Sobel(srcGray, edgeXMat, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
	//求y方向的Sobel边缘
	Sobel(srcGray, edgeYMat, CV_16S, 0, 1, 3, 1, 0, BORDER_DEFAULT);
	//线性变换,转换输入数组元素为8位无符号整形
	convertScaleAbs(edgeXMat, edgeXMat);
	convertScaleAbs(edgeYMat, edgeYMat);
	//x与y方向边缘叠加
	addWeighted(edgeXMat, 0.5, edgeYMat, 0.5, 0, edgeMat);
	imshow("X", edgeXMat);
	imshow("Y", edgeYMat);
	imshow("X+Y", edgeMat);
	waitKey(0);
}

实现效果:

由结果来看,实际上, X方向的结果为垂直型边界,Y方向的反而是水平边界。

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/82790345
今日推荐