图像处理-Canny算子、Sobel算子边缘检测

1. Canny算子边缘检测

//Canny-边缘检测 #include "cv.h" #include "highgui.h" int main() { // TODO: Add your command handler code here IplImage* pImage= NULL;// 声明IplImage 变量 IplImage* pImgCanny= NULL;// 声明IplImage 变量,用于灰度图像Canny变换 IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换 IplImage* pImg8uSmooth= NULL;// 声明IplImage 变量,用于存储平滑后的图像 //读入图像 pImage=cvLoadImage("lena.jpg", -1); //建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U //即无符号8位整型 pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1); pImgCanny = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1); pImg8uSmooth = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1); //对灰度图像进行Canny变换 //将彩色图像转换为灰度图像 cvCvtColor(pImage, pImg8u, CV_BGR2GRAY); //对图像进行高斯滤波 cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0); //cvCanny的源图像必须是灰度图像 cvCanny(pImg8uSmooth,pImgCanny, 100, 200, 3 ); //将图像格式再转换回来,用于显示 cvConvertScaleAbs(pImgCanny,pImg8u,1,0 ) ; //创建窗口,显示图像 cvvNamedWindow( "Canny Image", 1 ); cvvShowImage( "Canny Image", pImg8u); //等待按键 cvWaitKey(0); //销毁窗口 cvDestroyWindow( " Canny Image " ); //将程序开始定义的变量释放 cvReleaseImage( & pImage); cvReleaseImage( & pImgCanny); cvReleaseImage( & pImg8u); cvReleaseImage( & pImg8uSmooth); return 0; } 

 

2. Sobel算子边缘检测

//Sobel算子边缘检测 #include "cv.h" #include "highgui.h" int main() { // TODO: Add your command handler code here //定义的变量 IplImage* pImage= NULL; // 声明IplImage 变量 IplImage* pImgSobelgray= NULL;// 声明IplImage 变量,用于灰度图像Sobel变换 IplImage* pImg8u= NULL;// 声明IplImage 变量,用于图像格式转换 IplImage* pImg8uSmooth= NULL;// 声明IplImage 变量,用于存储平滑后的图像 IplImage* pImgColor= NULL;// 声明IplImage 变量,用于Sobel变换 IplImage* pImgSobelcolor= NULL;// 声明IplImage 变量,用于彩色图像Sobel变换 IplImage* pImgPlanes[3] = { 0, 0, 0 }; //读入图像 pImage=cvLoadImage("lena.jpg", -1); //建立和原始图像一样图像内存区,图像元素的位深度设为IPL_DEPTH_8U //即无符号8位整型 pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1); pImg8uSmooth = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1); //对灰度图像进行Sobel变换 //将彩色图像转换为灰度图像 cvCvtColor(pImage, pImg8u, CV_BGR2GRAY); //对图像进行高斯滤波 cvSmooth( pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0); //建立一新图像内存区,图像元素的位深度设为IPL_DEPTH_16S有符号16位整型 //因为cvSobel函数要求目标图像必须是16-bit图像 pImgSobelgray = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S, 1); //计算一阶 x方向的图像差分,可根据需要设置参数 cvSobel(pImg8uSmooth, pImgSobelgray,0,1,3); //将图像格式再转换回来,用于显示 cvConvertScaleAbs(pImgSobelgray,pImg8u,1,0 ) ; //创建窗口,显示图像 cvvNamedWindow( "Sobel gray Image", 1 ); cvvShowImage( "Sobel gray Image", pImg8u ); //对彩色图像进行Sobel变换 //建立3个图像内存区,分别存储图像3个通道,图像元素的位深度设为IPL_DEPTH_8U int i; for( i = 0; i < 3; i++ ) pImgPlanes[i] = cvCreateImage( cvSize(pImage ->width, pImage ->height), 8, 1 ); //建立一新图像内存区,图像元素的位深度设为IPL_DEPTH_16S有符号16位整型 pImgSobelcolor = cvCreateImage( cvSize(pImage ->width, pImage ->height), IPL_DEPTH_16S, 1 ); //要求输出图像是 16 位有符号的 pImgColor = cvCreateImage( cvSize(pImage ->width, pImage ->height), 8, 3 ); //将彩色图像分成3 个单通道图像 cvCvtPixToPlane(pImage, pImgPlanes[0], pImgPlanes[1], pImgPlanes[2], 0 ); for( i = 0; i < 3; i++ ) { //分别对每通道图像进行Sobel变换 cvSobel( pImgPlanes[i], pImgSobelcolor,0,1,3 ); //转化为8位的图像 cvConvertScaleAbs(pImgSobelcolor, pImgPlanes[i], 1, 0 ); } //将各通道图像进行合并 cvCvtPlaneToPix( pImgPlanes[0], pImgPlanes[1], pImgPlanes[2], 0, pImgColor); //创建窗口,显示图像 cvvNamedWindow( "Sobel color Image", 1 ); cvvShowImage( "Sobel color Image", pImgColor); //等待按键 cvWaitKey(0); //锁毁窗口 cvDestroyWindow( " Sobel gray Image " ); cvDestroyWindow( " Sobel color Image " ); //将程序开始定义的变量释放 cvReleaseImage( & pImage); cvReleaseImage( & pImgSobelgray); cvReleaseImage( & pImgSobelcolor); cvReleaseImage( & pImg8u); cvReleaseImage( & pImg8uSmooth); return 0; } 

你可能感兴趣的:(image,command,null,存储,图像处理)