您的位置:首页 > 其它

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

2011-03-05 23:58 567 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐