JAVA圖像處理——高斯模糊

JAVA圖像處理——高斯模糊

高斯模糊:
高斯模糊簡單的說就是讓圖像的像素點取周圍的像素點的平均,達到令圖片模糊的效果。
當然,簡單的取平均值是不太好的,因爲一般與像素點距離近的像素點他們的顏色更接近,距離遠的顏色偏離更大,所以可以採用正態分佈曲線來取權重。
正態分佈的曲線如下圖:
這裏寫圖片描述
正好符合中間點權重最高,距離中間點越遠距離越低的效果,而且過度很平滑(個人這麼認爲)。
我們需要2維的正態分佈函數,如下圖:
這裏寫圖片描述
sigma是方差,從方差的定義我們大概能推測方差越大,圖像模糊的越厲害,事實也是這樣。
接下來我們要決定應該取一個像素周圍多少範圍內的像素點來參與高斯權重值得計算呢?
我們取6sigma+1,因爲大於6sigma+1的正態分佈函數值(也就是權重)太小了,幾乎可以忽略不計了。
接下來我們可以計算我們的高斯權重矩陣了。我們用一個二維數組來保存這些權重值。
例如我們只取周圍距離一個像素的點來算平均值的畫就如下圖所示:
高斯權重二維矩陣
每個格子都是一個像素,對應二維矩陣內的就是當前位置像素的權重值,中間紅格子是當前要計算的像素,他的顏色值=周圍所有像素的 權重*顏色值之和。
根據上面的正態分佈函數公式,我們寫出了下面的方法求這個二維權重矩陣的所有值。

 private static float[][] getGaos(float sigma) {
        int size = (int) (6*sigma)+1;
        if(size%2==0) {
            size++;
        }
        float[][] res = new float[size][size];
        for(int y=0;y<size;y++)
            for(int x=0;x<size;x++){
                 float zhishu = -1*(((x-size/2)*(x-size/2))+((y-size/2)*(y-size/2)))/(2*sigma*sigma);
                 float a = (float) (1.0f/(2.0f*Math.PI*sigma*sigma));
                 res[x][y] = (float) (a*Math.pow(Math.E, zhishu));
                }
        return res;
    }

然後根據權重矩陣計算各個點的像素顏色值就可以了。
下面是效果圖:
原圖
模糊圖
最後要注意邊界的矩陣取不到全部的像素值時只要取能取到的值就可以了。
如果還不明白的話這裏也有講,我也是從這裏參考來的:
http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章