發展到如今這個平滑算法的時候, 我已經徹底不知道如何去命名這篇文章了, 只好羅列出一些關鍵字來方便搜索了.算法
在以前咱們提到過了均值濾波器, 就是說某像素的顏色, 由以其爲中心的九宮格的像素平均值來決定. 在這個基礎上又發展成了帶權的平均濾波器, 這裏的高斯平滑或者說濾波器就是這樣一種帶權的平均濾波器. 那麼這些權重如何分佈呢? 咱們先來看幾個經典的模板例子:ide
嘗試了使用這些濾波器對咱們原來的圖進行操做, 獲得了這樣的一組結果:spa
原圖:code
3x3 高斯:orm
5x5 高斯:ip
單純從效果來看, 兩個模板都起到了平滑的做用, 只是程度有深淺的區分. 那麼從理論上來講爲何能起到平滑的做用呢? 很顯然, 像素的顏色不只由自身決定了, 同時有其周圍的像素加權決定, 客觀上減少了和周圍像素的差別. 同時這些權重的設定知足了越近權重越大的規律. 從理論來說, 這些權重的分佈知足了著名的所謂高斯分佈:element
這就是1維的計算公式rem
這就是2維的計算公式input
x, y表示的就是當前點到對應點的距離, 而那些具體的模板就是由這裏公式中的一些特例計算而來. 須要說明的是不僅有這麼一些特例, 從wikipedia能夠方便地找到那些複雜的模板好比像:it
This is a sample matrix, produced by sampling the Gaussian filter kernel (with σ = 0.84089642) at the midpoints of each pixel and then normalising. Note that the center element (at [4, 4]) has the largest value, decreasing symmetrically as distance from the center increases.
0.00000067 | 0.00002292 | 0.00019117 | 0.00038771 | 0.00019117 | 0.00002292 | 0.00000067 |
0.00002292 | 0.00078633 | 0.00655965 | 0.01330373 | 0.00655965 | 0.00078633 | 0.00002292 |
0.00019117 | 0.00655965 | 0.05472157 | 0.11098164 | 0.05472157 | 0.00655965 | 0.00019117 |
0.00038771 | 0.01330373 | 0.11098164 | 0.22508352 | 0.11098164 | 0.01330373 | 0.00038771 |
0.00019117 | 0.00655965 | 0.05472157 | 0.11098164 | 0.05472157 | 0.00655965 | 0.00019117 |
0.00002292 | 0.00078633 | 0.00655965 | 0.01330373 | 0.00655965 | 0.00078633 | 0.00002292 |
0.00000067 | 0.00002292 | 0.00019117 | 0.00038771 | 0.00019117 | 0.00002292 | 0.00000067 |
是否是看到就頭大了:) 不過不要緊, 對於通常的應用來講, 前面的例子已經能夠完成任務了. 代碼的話咱們仍是給一份5x5的example:
/** ** method to remove noise from the corrupted image by gaussian filter value * @param corrupted input grayscale binary array with corrupted info * @param smooth output data for smooth result, the memory need to be allocated outside of the function * @param width width of the input grayscale image * @param height height of the input grayscale image */ void gaussianFilter2 (unsigned char* corrupted, unsigned char* smooth, int width, int height) { int templates[25] = { 1, 4, 7, 4, 1, 4, 16, 26, 16, 4, 7, 26, 41, 26, 7, 4, 16, 26, 16, 4, 1, 4, 7, 4, 1 }; memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) ); for (int j=2;j<height-2;j++) { for (int i=2;i<width-2;i++) { int sum = 0; int index = 0; for ( int m=j-2; m<j+3; m++) { for (int n=i-2; n<i+3; n++) { sum += corrupted [ m*width + n] * templates[index++] ; } } sum /= 273; if (sum > 255) sum = 255; smooth [ j*width+i ] = sum; } } }附帶說一些,很明顯,和均值濾波器相似, 這個濾波器沒有消除校驗噪聲的做用.