Canny邊緣檢測部分步驟思考

2021-08-13 16:33:45 字數 2065 閱讀 7673

用opencv寫的一次作業,打算是重下canny這個函式,然後稍微理一下有一點點自己思考的部分(沒有**因為拖延症並沒有在ddl前把它寫完……)

這種方法第一眼看到覺得很神奇……不過在維基和opencv的官網上用到的方法都不是這一種。

這一步會對使用線性插值或對方向離散化效能和實現的比較。分析了一下覺得意義不大就沒有實現……因為要加很多運算量。

乙個是之前偷懶想的可以不用開根號,一旦用了這種方法直接計算就不是線性插值了……另乙個是看了一下sobel運算元得到的結果,發現在比如22.5、67.5附近的不算多,感覺對於整體結果影響不會非常大。而且一旦實現這個過程,要多出兩條三角函式的運算,感覺意義不大。

偽**:

pi_4 = atan(1);    // 得到pi/4的值

mode = (atan(grady / gradx) + pi_4 * 5 / 2) / pi_4; //離散化

這裡對於gradx為零單獨處理。

還有乙個就是負數除法和正數不一樣orz

然後要是要提高效率應該可以直接根據grady / gradx來計算不需要求出arctan。

直接指定閾值對閾值進行測試。

計算梯度的直方圖,這樣可以直接規定(前30%是強邊界,前70%是弱邊界)等,或許可以實現對影象更好的控制。

此外還有使用大津演算法來確定。這是一種區分前景和背景的演算法,求出的閾值為高閾值,高閾值的1/2為低閾值[1]。

預告一下用這種方法直接毫無懸念的直接stackoverflow了。反正我寫的連lena都跑不動……直接棄了。

for all strong edge point i:

function

addpoint

(i);

function

addpoint

(i):

if i is a week edge:

add i in the edge;

for point j around point i:

addpoint(j);

這種方法就是,類似形態**算,就是相當於一次次膨脹,然後每次膨脹完除掉不可能是邊界的點再一次膨脹。

flag = false;

while (flag)

flag = false;

for every weak edge i:

for point j around point i:

if j is a strong edge:

add i in the edge;

flag = true; // 沒有再次更新的時候停止

演算法複雜度應該在o((m*n)^2),在低閾值和高閾值相差越大的時候運算會越慢,當兩個值相近的時候膨脹次數少,很快就能結束。

是對函式迭代的一種簡化。

for all strong edge point i:

stack.push(i);

while(stack is

notempty):

i = stack.pop();

for point j around point i:

if j is a week edge:

add j in the edge;

stack.push(j);

這種方法的演算法複雜的讀應該在o(m*n),因為乙個點最多入棧出棧8次(周圍有8個點)。

這個是根據之前的圖形學想到的。其實strong edge相當於起始的著色點。然後判斷不是edge的可以認為是邊界。然後在這種情況下可以大大減少上一種情況的入棧的點。

這種演算法的基礎應該是按行進行操作。每一行連通的點可以認為是用最左側的點代表。每次入棧的是上下行的第乙個。

雖然這種演算法應該不是特意為這種有一堆初始點的情況寫的但至少比我想到的前一種演算法肯定快(x)

[1]維基 演算法的總體思路歸納

[2]opencv的canny函式官方文件

[5]根據百分比確定閾值

[6]插值的思想

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.閾值篩選 我們就事後諸葛亮,分析下這個步驟的緣由。首先,影象降噪。我們知道梯度運算元可以用於增強影象,本質上是通...