opencv实现边缘提取方法总结

分别用Canny算子、sobel算子和Laplace算子实现边缘提取,代码如下:

// 边缘提取.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include 
#include 
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc ,char ** argv)
{
#if 0
	//canny算子
	IplImage *src =cvLoadImage("E:\\picture\\lena.bmp");
	IplImage *gray=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
	cvCvtColor(src,gray,CV_RGB2GRAY);
	IplImage * pCannyImg=cvCreateImage(cvGetSize(gray),IPL_DEPTH_8U,1);
	cvCanny(gray,pCannyImg,50,150,3);
        //创建窗口
        cvNamedWindow("src", 1);
        cvNamedWindow("canny",1);


        //显示图像
        cvShowImage( "src", src );
        cvShowImage( "canny", pCannyImg );

        cvWaitKey(0); //等待按键

        //销毁窗口
        cvDestroyWindow( "src" );
        cvDestroyWindow( "canny" );
        //释放图像
        cvReleaseImage( &src ); 
        cvReleaseImage( &pCannyImg );

#endif
#if 0
		//Sobel算子
		Mat src=imread("e:\\picture\\lena.bmp");
		Mat dst_x,dst_y,dst;
		Sobel(src,dst_x,src.depth(),1,0);
		Sobel(src,dst_y,src.depth(),0,1);
		convertScaleAbs(dst_x, dst_x);  //使用线性变换转换输入数组元素成8位无符号整型
        convertScaleAbs(dst_y, dst_y); 
		addWeighted( dst_x, 0.5, dst_y, 0.5, 0, dst); 
		imshow("dst",dst);
		imwrite("Sobel_lena.bmp",dst);
		namedWindow("src");
		imshow("src",src);
		waitKey(0);

#endif
#if 1
		//LapLace 拉普拉斯算子
		Mat src=imread("e:\\picture\\lena.bmp");
		Mat dst;
		Laplacian(src,dst,src.depth(),3);
		convertScaleAbs(dst,dst);
		namedWindow("src");
		namedWindow("dst");
		imshow("src",src);
		imshow("dst",dst);
		waitKey(0);
		
#endif


    return 0;
}

原图lena.bmp

opencv实现边缘提取方法总结_第1张图片

Canny算子实现结果:


sobel算子实现结果:


Laplace算子实现结果:




你可能感兴趣的:(opencv)