[OPENCV] Gaussian Filter

在一些圖形分析上我們使用到了Gaussian Filter (如 Edge Detect)
這一篇就要來介紹

Gaussian Filter

Gaussian Filter的用途是在模糊圖片

這道理是因為圖片上通常都會有雜點, 雜點會造成誤判, 另外一個方面是要降低細節, 因為細節太過突兀也會造成誤判, 為了降低這些問題, 因此才會導入了一種方式來模糊圖片

Gaussian Filter的由來

這要從Gaussian distribution開始說起


這個函數的特殊性是在於積分全域會得到 1
這其實是看作一種分布概率, 全部的可能性加起來是 100% (1), 在每一個點可能出現的機率密度是 G(x,y), 如果我們畫成3-D圖, 他會類似是這樣 (我們設定 sigma = 1)


可以看得出來在 (0,0)位置是最高峰
這解讀上理解為, 一個物件跟周遭的關聯性, 在 (0,0)的時候關聯性最高(自身), 越往外越低

把每個像素都應用上這種分佈, 接著將每個像素上得到的分量都疊加起來, 就可以重新組合一個像素, 這種方式其實用另外一種角度思考, 就變成 convolution

因為我們的每個pixel都是discrete, 因此在使用convolution的時候就要使用 discrete的方式

Discrete Gaussian Filter

Gaussian Distribution是連續性的分佈函數, 在應用到離散空間的時候, 需要重新製作成為離散的型態
首先我們先簡單地定下sigma = 1, 另外連續積分的部份我們轉化成使用 step = 0.001的方式步進, 因為距離2.5個sigma距離之外, 分布機率已經變得很低 ( G(x,y) 很低 ), 按照這些設定, 我們可以寫下octave code 來求得離散分布的概率 (這邊使用 5x5的矩陣來表示上面圖示的分佈)

1 4.0302 6.40586 4.0302 1
4.0302 16.2425 25.8169 16.2425 4.0302
6.40586 25.8169 41.035 25.8169 6.40586
4.0302 16.2425 25.8169 16.2425 4.0302
1 4.0302 6.40586 4.0302 1

使用octave的程式碼如下
sigma = 1;
m = n = 2.51 * sigma;
step=0.001;
m_range = (m) + step / 2;
n_range = (n) + step / 2;

m_start = -m_range;
m_stop = m_range;
n_start = -n_range;
n_stop = n_range;

[h1, h2] = meshgrid(m_start:step:m_stop, n_start:step:n_stop);
hg = exp(- (h1.^2+h2.^2) / (2*sigma^2));


m_grid=5; n_grid=5;
m_size_grid = ((m_stop - m_start) / step + 1 - 2) / m_grid
n_size_grid = ((n_stop - n_start) / step + 1 - 2)/ n_grid
region = zeros(m_grid,n_grid);

for i= 1:m_grid
  for j=1:n_grid
    row_start = (i-1) * m_size_grid + 2;
    row_stop = i * m_size_grid + 1;
    col_start = (j-1) * n_size_grid + 2;
    col_stop = j * n_size_grid + 1;
    region(i,j) = sum(hg(row_start:row_stop, col_start:col_stop)(:));
  end
end
 
int_region = region ./ (region(1,1));
int_region
sum(int_region(:))

將這table做整數處理之後, 另外一開始也說了, 這Gaussian分佈其實就像是機率分佈, 所以每種可能性相加後, 會得到 100%, 所以按照這個思路, 這離散的Gaussian分佈就變成


大致上Gaussian的介紹就到這邊了~

Gaussian Filter的應用以及openCV code 請參照 Camera capture
喵~

沒有留言:

張貼留言

OpenGL 閱讀筆記 (二) OpenGL基本操作

這邊虎喵跳過glfw/glew的初始化, 先來提一下OpenGL的基本操作方式 前面也提到過, OpenGL是一個類C的語言, 因此使用C/C++的攻城獅們應該會感到很熟悉. OpenGL的基本動作循環如下: 每一行code的解釋如下: // 本地變數,...