(20)Canny邊緣檢測

2021-08-21 12:01:48 字數 1942 閱讀 2407

/*

*canny邊緣檢測

*canny演算法介紹

canny是邊緣檢測演算法, 在2023年提出的,是乙個很好的邊緣檢測器,很常用也很實用的影象處理方法

五步in cv::canny

1.高斯模糊-gaussianblur 所有影象的模糊都是對影象進行降噪,把細微的可能有影響結果的點都給去掉,免得它影響最終演算法的結果

2.灰度轉換-cvtcolor

3.計算梯度-sobel/scharr

4.非最大訊號抑制 邊緣的訊號很強,但邊緣只能有乙個,不能說你這麼很寬都是邊緣,所以要對非邊緣的一些畫素進行壓制

就是如果在它的方向上面如果它不是最大值的話我們就把它去掉,切向是角度的方向,法向是它跟垂直90度的

方向,在它左右兩邊如果值都小於當前的這個那麼我們就把它去掉

對影象所有的點都做非最大訊號抑制

θ取值範圍在-π/2到π/2加上π/2就是0到π之間,這個θ就是說我們這個梯度的方向是什麼,梯度在向哪個方向上面變化率最大

x方向變化很大的話θ就會很小,就得到變化的趨勢向哪乙個方向,這就是我們梯度的方向,我們跟梯度垂直的方向上面在它的左邊和右邊和中間的值相比,

如果都比它小左邊和右邊都去掉,中間最大值這個保留,這個叫做非最大訊號抑制,反正就是把較小的去掉了

5.高低閾值輸出二值影象 第四步後都是一些邊緣畫素了,有的邊緣是連線在一起的,有的是各種各樣的干擾,它跟邊緣沒有連起來,通過

高低閾值設定進行乙個邊緣連線,如果大於最高閾值的畫素都要保留下來,如果小於最低閾值的畫素都要捨棄,如果在

這兩個閾值之間的要對它進行閾值連線,如果這個值有跟它相鄰的高的閾值,最終這個畫素就跟高的閾值相連並且大於

最小的那個畫素值,然後保留並且跟高閾值的連線成一條線,這就是邊緣連線,邊緣連線之後我們就得到二值影象就輸出

a.如果某一畫素位置的幅值超過 高 閾值, 該畫素被保留為邊緣畫素。

b.如果某一畫素位置的幅值小於 低 閾值, 該畫素被排除。

c.如果某一畫素位置的幅值在兩個閾值之間,該畫素僅僅在連線到乙個高於 高 閾值的畫素時被保留。

canny 推薦的 高:低 閾值比在 2:1 到3:1之間。

t1, t2為閾值,凡是高於t2的都保留,凡是小於t1都丟棄,從高於t2的畫素出發,凡是大於t1而且相互連線的,都保留。最終得到乙個輸出二值影象。

推薦的高低閾值比值為 t2: t1 = 3:1/2:1其中t2為高閾值,t1為低閾值

api – cv::canny

canny(

inputarray src, // 8-bit的輸入影象,當時它不支援彩色影象,所以要先把影象轉為灰度

outputarray edges,// 輸出邊緣影象, 一般都是二值影象,背景是黑色

double threshold1,// 低閾值,常取高閾值的1/2或者1/3

double threshold2,// 高閾值

int apterturesize,// soble運算元的size,通常3x3,取值3

bool l2gradient // 選擇 true表示是l2來歸一化,否則用l1歸一化, l1表示用sobel的兩個方向的運算元取絕對值再相加的和

l2表示用sobel的兩個方向的運算元平方和再開根號

)*/#include #include using namespace std;

using namespace cv;

mat src, gray_src, dst;

int t1_value = 50; //影響canny的結果是閾值

int max_value = 255; //得出來的應該是二值影象,所以不能再大了

const char* output_title = "canny result";

void canny_demo(int, void*);

int main()

void canny_demo(int, void*)

Canny邊緣檢測

1.canny邊緣檢測基本原理 1 圖象邊緣檢測必須滿足兩個條件 一能有效地抑制雜訊 二必須盡量精確確定邊緣的位置。2 根據對訊雜比與定位乘積進行測度,得到最優化逼近運算元。這就是canny邊緣檢測運算元。3 類似與marr log 邊緣檢測方法,也屬於先平滑後求導數的方法。2.canny邊緣檢測演...

Canny邊緣檢測

canny運算元是邊緣檢測運算元中最常用的一種,是公認效能優良的一種運算元,常被其它邊緣檢測運算元作為標準運算元進行優劣分析。canny演算法基本可以分為3個步驟 平滑 梯度計算 基於梯度值及梯度方向的候選點過濾 1 平滑 影象梯度的計算對雜訊很敏感,因此必須首先對其進行低通濾波。在這裡使用5 5的...

Canny邊緣檢測

canny邊緣檢測是一種非常流行的邊緣檢測演算法,是john canny在1986年提出的。它是乙個多階段的演算法,即由多個步驟構成。1.影象降噪 2.計算影象梯度 3.非極大值抑制 4.閾值篩選 我們就事後諸葛亮,分析下這個步驟的緣由。首先,影象降噪。我們知道梯度運算元可以用於增強影象,本質上是通...