分别用Canny算子、sobel算子和Laplace算子实现边缘提取,代码如下:
// 边缘提取.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <cmath>
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
Canny算子实现结果:
sobel算子实现结果:
Laplace算子实现结果: