Canny邊緣檢測及圖像縮放之圖像處理算法-OpenCV應用學習筆記四

logo_thumb9_thumb

在邊緣檢測算法中Canny頗爲經典,咱們就來作一下測試,而且順便實現圖像的尺寸放縮。算法

實現功能:

    直接執行程序獲得結果以下:將載入圖像顯示在窗口in內,同時進行圖像兩次縮小一半操做將結果顯示到i1,i2窗口內,Canny邊緣提取結果顯示在i3。函數

[QQY1KVC{DVVEM}@12M8[@G

函數精析:

  • void cvPyrDown(const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 )

  • 使用Gaussian金字塔分解輸入圖像向下採樣
  • dst:輸出指定尺寸圖像,跟原圖像同類型
  • 首先該函數與內核卷積,而後向下採樣刪除偶數行列信息
  • cvCanny(src, dst, double threshold1, double threshold2, int apertureSize=3 )

  • 發現輸入圖像的邊緣而且輸出邊緣圖像,僅僅支持單通道8位圖像
  • 輸出圖像尺寸和類型與原圖像相同
  • 閾值1和閾值2中小閾值用來控制邊緣鏈接,大閾值用在突出邊緣的初始分割
  • 核心步驟:高斯濾波-一階偏導有限差分計算梯度-雙閾值算法檢測和鏈接邊緣-高斯平滑
  • 附源代碼:

#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;
}
相關文章
相關標籤/搜索