Java圖像處理之高斯模糊

jopen 12年前發布 | 67K 次閱讀 Java 圖形/圖像處理

高斯模糊是一種兩維的卷積模糊操作,在圖像完成高斯模糊相對于均值模糊來說,

計算量會增加,但是高斯模糊可以實現一些特殊效果,特別是在圖像噪聲(非椒鹽

噪聲)消去方面,更是有著非常好的效果。一維高斯公式如下:

其中x是制定[-n,n]范圍的整數,sigma代表標準方差。通常取值為1.

一維高斯函數Java代碼如下:

   private float[] get1DKernalData(int n, float sigma) {
        float sigma22 = 2*sigma*sigma;
        float Pi2 = 2*(float)Math.PI;
        float sqrtSigmaPi2 = (float)Math.sqrt(Pi2) * sigma ;
        int size = 2*n + 1;
        int index = 0;
        float[] kernalData = new float[size];
        for(int i=-n; i<=n; i++) {
            float distance = i*i;
            kernalData[index] = (float)Math.exp((-distance)/sigma22)/sqrtSigmaPi2;
            System.out.println("\t" + kernalData[index]);
            index++;
        }
        return kernalData;
    }

假設輸入 n= 1, sigma = 1時,輸出的Kernel數據為:

0.24197073, 0.3989423, 0.24197073

兩維的高斯分布函數為:

對應的Java實現代碼為:

   public float[][] get2DKernalData(int n, float sigma) {
        int size = 2n +1;
        float sigma22 = 2sigmasigma;
        float sigma22PI = (float)Math.PI  sigma22;
        float[][] kernalData = new float[size][size];
        int row = 0;
        for(int i=-n; i<=n; i++) {
            int column = 0;
            for(int j=-n; j<=n; j++) {
                float xDistance = ii;
                float yDistance = jj;
                kernalData[row][column] = (float)Math.exp(-(xDistance + yDistance)/sigma22)/sigma22PI;
                column++;
            }
            row++;
        }

    for(int i=0; i<size; i++) {
        for(int j=0; j<size; j++) {
            System.out.print("\t" + kernalData[i][j]);
        }
        System.out.println();
        System.out.println("\t ---------------------------");
    }
    return kernalData;
}</pre> 

當n=1, sigma=1時對應輸出的Kernel數據為:

    0.058549833   0.09653235     0.058549833

    0.09653235     0.15915494     0.09653235

    0.058549833   0.09653235     0.058549833

一個2D高斯分布的圖可以表示如下:

高斯過濾在圖像處理是一種低通濾波,會除去圖像的細節而保持整體不變化,在圖像美化和特效

方面,高斯過濾有這很多應用。高斯模糊不同于均值模糊!

 

本文實現完整的高斯模糊算法包括下面幾個步驟:

1. 生成高斯操作數即Kernel Data

2. 從圖像中讀取像素,利用第一步的操作數,完成卷積。

3. 發現圖像處理前后的最大像素值peak得出rate

4. 完成歸一化操作,返回處理后像素數組

關鍵程序解析:

利用操作數完成卷積的代碼參看以前的Blog文章《圖像處理之理解卷積

完成歸一化操作的算法非常簡單, 主要是利用第三步計算出來的rate

        // normalization
        float rate = inMax/outMax;
        System.out.println("Rate = " + rate);
        for(int row=0; row<height; row++) {
            for(int col=0; col<width; col++) {
                index = row * width + col;
                int rgb1 = tempoutPixels[index];
                int red = (rgb1 >> 16) & 0xff;
                int green = (rgb1 >> 8) & 0xff;
                int blue = rgb1 & 0xff;
                red = (int)(rate * red);
                green = (int)(rate * green);
                blue = (int)(rate * blue);
                outPixels[index] = (rgb1 & 0xff000000) | (red << 16) | (green << 8) | blue;
            }
        }

高斯模糊效果如下:

 - 左邊為原圖                                                                                                                                                            
- 右邊為高斯模糊之后效果,發現皺紋和手部滑了

等等現在還不最cool的效果,高斯模糊之后如果與原圖像疊加會出現一種Glow的

效果,好像燈光打在圖像上一樣,Glow處理之后的運行效果如下:

原圖:

實現Glow Filter之后的圖像:

實現Glow算法只是高斯模糊輸出像素值疊加原來的像素值。

       int index = 0;
        for ( int y = 0; y < height; y++ ) {
            for ( int x = 0; x < width; x++ ) {
                int rgb1 = outPixels[index];
                int r1 = (rgb1 >> 16) & 0xff;
                int g1 = (rgb1 >> 8) & 0xff;
                int b1 = rgb1 & 0xff;

            int rgb2 = inPixels[index];
            int r2 = (rgb2 >> 16) & 0xff;
            int g2 = (rgb2 >> 8) & 0xff;
            int b2 = rgb2 & 0xff;

            r1 = PixelUtils.clamp( (int)(r1 + a * r2) );
            g1 = PixelUtils.clamp( (int)(g1 + a * g2) );
            b1 = PixelUtils.clamp( (int)(b1 + a * b2) );

            inPixels[index] = (rgb1 & 0xff000000) | (r1 << 16) | (g1 << 8) | b1;
            index++;
        }
    }</pre> 


轉載: http://blog.csdn.net/jia20003/article/details/7234741

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!