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上。