1. 程式人生 > >7.邊緣檢測:2D運算——回顧、高斯濾波器2D的導數、Sigma對導數的影響_1

7.邊緣檢測:2D運算——回顧、高斯濾波器2D的導數、Sigma對導數的影響_1

目錄

回顧

高斯濾波器2D的導數

Sigma對導數的影響


回顧

我們要完成我們的邊緣檢測這個單元,然後它會被用在你以後要做的事情上。

上單元我們講了邊的概念以及它們是如何與梯度和函式導數的大小相關的。

我們還記得,如果你大腦的某個部分脫落了,應該是梯度是什麼。

我們討論過開發一些運算,你可以應用到影象中去計算這些梯度。

我們展示了它們是如何對噪音敏感的,我們不得不擔心濾波器以平滑這些東西。

我們討論過,我們可以首先過濾影象。然後應用運算。或者我們可以先過濾操作。

抱歉,我們可以平滑運算並將其應用到影象上。

這是一幅圖,它提醒我們這樣做:

這是函式f。這是平滑濾波器。對它求導。

從那以後,我們可以用這個運算元來求出這些峰和邊。

高斯濾波器2D的導數

當然,在2D中,它不僅僅是一個導數我們還要討論導數的方向。

在梯度,我們有x方向的導數和y方向的導數。

所以當你用同樣的方法求濾波器的導數時,我們要問,在哪個方向上求導?

我們是這樣寫的:

我們要做的是,假設我們要對x方向求導。

這個小 h_{x}(圖中紅色線) 意味著這是一個小濾波器它只對x方向求導。也許它是一個Sobel運算子,也許它是另外一個。

但它是一個求導的小濾波器。(h_{x}

g是高斯函式,看圖:

正如我們之前所說的,由於關聯屬性,除了平滑然後取導數之外,我們可以應用一個高斯運算元及其導數:

這就是這裡顯示的:

而- 1 1,這是一個平凡的,它可以是- 1 0 1,它是一般的導數運算元。

而g,這是我的高斯函式,很平滑的,我從矩陣中取出一大塊,就像這樣:

這給了我們什麼?

這個函式就是這樣的:

這就是說,它是高斯的第一個導數,當我應用於影象時,它為我提供了高斯平滑影象的導數,用於之前的關聯屬性。

所以問題是,這樣做是否更好。我們應該把它當成一個小測驗。

因為這更可取。

小測驗:

為什麼對平滑函式應用h更好,h是我們的導數,然後應用這個結果?

A、嗯,它不是。他們在數學上等價的。

B、因為h通常更小,我們取更少的導數,所以它更快。

C、光滑的導數運算子計算一次重複使用;

D、B和C。

答案:D。A是正確的,但與此無關。是的,它們在數學上是等價的,但我只是說,你為什麼喜歡其中一個?

B和C都是可能的原因。我想要梯度和x方向。這是我的濾鏡,我就用它。這讓計算變得更簡單。

你知道,往前,你可能已經決定你已經有了不同的平滑影象,而你只是採用漸變,所以你直接這樣做。

Sigma對導數的影響

就像我說的,當你這樣做的時候,你會得到這個梯度函式。

當然,我們在x方向和y方向都這樣做:

我們現在有了相關性和卷積的問題。

如果這是x方向,如果x向這個方向正,這是一個相關濾波器。順便說一下,這張圖就是這張圖的樣子:

所以外面的這些0值,就是這些灰色的,負的是負的,正的是正的:

在y方向上,哪個方向是正的總是一個問題,因為,就像我們說的,y可以向上或者向下。

你知道的,主要的問題是,它,它,它是垂直的:

以上就是這兩個運算元。

這就是用高斯函式得到光滑導數的方法。

但有一個問題是高斯函式的大小是多少?

你們可能還記得,通過濾波我們可以選擇不同大小的高斯分佈,這裡是fspecial,用來得到不同的Sigma。

>> for sigma = 1:3:10
    h = fspecial('gaussian', fsize, sigma);
    out = imfilter(im, h);
    imshow(out);
    pause;
    end
>>

程式碼執行結果:

這裡顯示的結果就是,你會得到或多或少平滑的影象。

當我們計算導數時也是一樣的。

我們可以改變高斯函式的Sigma大小。

當你這樣做的時候,你會得到某種程度的增強,這些導數的大小作為影象在空間中變化的速度的函式。

有了一個小的sigma,所有這些精細的紋理在這裡隨處可見:

事實上,即使是這個小紋理也會出現在這裡:

但如果我用更大的sigma呢?

所以這個區域你可以看到這裡的變化少了很多,因為我們平滑了大部分的小變化:

我們可以這樣想,更小的值,更精細的特徵會被檢測到,更大的值,只有更大的邊緣會被檢測到。


——學會編寫自己的程式碼,才能練出真功夫。