在邊緣檢測算法中Canny頗爲經典,咱們就來作一下測試,而且順便實現圖像的尺寸放縮。算法
直接執行程序獲得結果以下:將載入圖像顯示在窗口in內,同時進行圖像兩次縮小一半操做將結果顯示到i1,i2窗口內,Canny邊緣提取結果顯示在i3。函數
#include "stdafx.h" #include"cv.h" #include"highgui.h" /* 定義圖像放縮函數doPyrDown(原圖像,高斯5*5濾波器) */ IplImage* doPyrDown(IplImage* in,int filter = CV_GAUSSIAN_5x5) { IplImage* out = cvCreateImage(cvSize(in->width/2,in->height/2),in->depth,in->nChannels); /*使用Gaussian金字塔分解輸入圖像向下採樣*/ /*首先該函數與內核卷積,而後向下採樣刪除偶數行列信息*/ cvPyrDown(in,out); return(out); }; /* 定義邊緣檢測函數doCanny(原圖像,若邊緣鏈接閾值,強邊緣分割閾值,索貝爾算子內核尺寸) */ IplImage* doCanny(IplImage* in,double lowThresh,double highThresh,double aperture) { if(in->nChannels != 1)//僅支持單通道圖像 return(0); IplImage* out = cvCreateImage(cvGetSize(in),IPL_DEPTH_8U,1); //找輸入圖像的邊緣並輸出圖像中標識着這些邊緣 cvCanny(in ,out,lowThresh,highThresh,aperture); return(out); }; int _tmain(int argc, _TCHAR* argv[]) { IplImage* in = cvLoadImage("lena.jpg",0); //載入原圖像 IplImage* img1 = doPyrDown( in, CV_GAUSSIAN_5x5);//圖像尺寸縮小一半 IplImage* img2 = doPyrDown(img1,CV_GAUSSIAN_5x5);//繼續縮小一半 IplImage* img3 = doCanny(img2,10,100,3);//邊緣檢測 cvNamedWindow("in"); cvNamedWindow("i1"); cvNamedWindow("i2"); cvNamedWindow("i3"); cvShowImage("in",in); cvShowImage("i1",img1); cvShowImage("i2",img2); cvShowImage("i3",img3); cvWaitKey(0); cvDestroyWindow("in"); cvDestroyWindow("i1"); cvDestroyWindow("i2"); cvDestroyWindow("i3"); return 0; }