20.Canny邊緣檢測

1.主要內容

  • Canny算法介紹
  • API cv::Canny()
    clone和copyto的區別,詳見鏈接,注意copyto的掩碼圖
    圖像的取反

2.Canny算法介紹

  • Canny是邊緣檢測算法,於1986年提出
  • 是一個很好的邊緣檢測器
  • 是常用也很實用的圖像處理方法
    其算法步驟如下:
高斯模糊——GaussianBlur()              //降噪聲
灰度轉換——cvtColor
計算梯度——sobel/Schar                  
非最大信號抑制
高低閾值輸出二值圖像
  • 非最大信號抑制
    當邊緣的信號很強時,系統會認爲一大塊都是邊緣,但是邊緣只能有一個,此時我們就要對非邊緣的像素進行一個抑制。對最大信號抑制————在這個方向上,不是最大值的話,就把它的值去掉,
    在sobel算子之後,我們得到一個Gx和Gy,通過對它們的計算,我們得到一個角度,通過這個角度我們得到一個梯度變化的趨勢,例如,我們得出在+x軸方向變化較大,那麼我們就尋找+y(垂直方向)方向,現在左邊、右邊跟它中間的值相比,如果比它的值小,那麼左邊和右邊都刪掉,中間保留。
    在這裏插入圖片描述

  • 高低閾值輸出二值圖像
    解釋:此時的圖像由於之前的非最大信號抑制,所以目前圖像的邊緣都比較突出,但是可能由於一些原因一些邊緣尚未連接起來,此時我們就需要這種方式來進行邊緣的連接。
    具體操作:T1,T2爲閾值,凡是高於T2的都保留,凡是小於T1的丟棄,從高於T2的像素出發,凡是大於T1而且相互連接的,都保留,最終得到一個二值圖像。
    推薦的高低閾值比值爲 T2: T1 = 3:1/2:1其中T2爲高閾值,T1爲低閾值
    在這裏插入圖片描述
    在這裏插入圖片描述

3.API詳解

(canny函數幫助我們封裝好了以下五個步驟,高斯模糊、轉化灰度圖、sobel算子、非最大信號抑制、高低閾值輸出最大值)

Canny(
    InputArray  src,     //8-bit的輸入圖像
    OutputArray  edges,  //輸出邊緣圖像,一般都是二值圖像,背景是黑色
    double threshold1,   //低閾值,常取高閾值的1/2或者1/3
    double threshold2,   //高閾值
    int aptertureSize,   //Sobel算子,常取3x3,取值3
    bool  L2gradient     //選擇true表示是L2來歸一化,默認用L1(false)歸一化 
)

4.image.copyTo(image2)函數的補充解釋

copyTo這個函數有兩種定義方式,分別是

void  copyTo (OutputArray m)  const;

void  copyTo(OutputArray m ,InputArray mask)  const;

即,參數可以是一張輸出圖像,或者一張輸出圖像和一個掩碼圖
那麼
image.copyTo(imageROI);
就是把image這張圖片複製(copy to)到imageROI上
image.copyTo(imageROI,mask);
則是不僅把image這張圖複製(copy to)到mageROI上,且image對應mask中像素值爲0的像素 點都不會貼到imageROI上。

課外擴展:
OpenCV3之——copyTo()函數的使用方法
Canny邊緣檢測分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章