zoukankan      html  css  js  c++  java
  • 图像处理------高斯模糊 分类: 视频图像处理 2015-07-24 09:32 29人阅读 评论(0) 收藏

    高斯模糊是一种两维的卷积模糊操作,在图像完成高斯模糊相对于均值模糊来说,

    计算量会增加,但是高斯模糊可以实现一些特殊效果,特别是在图像噪声(非椒盐

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


    其中x是制定[-n,n]范围的整数,sigma代表标准方差。通常取值为1.

    一维高斯函数Java代码如下:

    1. private float[] get1DKernalData(int n, float sigma) {  
    2.     float sigma22 = 2*sigma*sigma;  
    3.     float Pi2 = 2*(float)Math.PI;  
    4.     float sqrtSigmaPi2 = (float)Math.sqrt(Pi2) * sigma ;  
    5.     int size = 2*n + 1;  
    6.     int index = 0;  
    7.     float[] kernalData = new float[size];  
    8.     for(int i=-n; i<=n; i++) {  
    9.         float distance = i*i;  
    10.         kernalData[index] = (float)Math.exp((-distance)/sigma22)/sqrtSigmaPi2;  
    11.         System.out.println(" " + kernalData[index]);  
    12.         index++;  
    13.     }  
    14.     return kernalData;  
    15. }  

    假设输入 n= 1, sigma = 1时,输出的Kernel数据为:

    0.24197073, 0.3989423,0.24197073


    两维的高斯分布函数为:


    对应的Java实现代码为:

    1. public float[][] get2DKernalData(int n, float sigma) {  
    2.     int size = 2*n +1;  
    3.     float sigma22 = 2*sigma*sigma;  
    4.     float sigma22PI = (float)Math.PI * sigma22;  
    5.     float[][] kernalData = new float[size][size];  
    6.     int row = 0;  
    7.     for(int i=-n; i<=n; i++) {  
    8.         int column = 0;  
    9.         for(int j=-n; j<=n; j++) {  
    10.             float xDistance = i*i;  
    11.             float yDistance = j*j;  
    12.             kernalData[row][column] = (float)Math.exp(-(xDistance + yDistance)/sigma22)/sigma22PI;  
    13.             column++;  
    14.         }  
    15.         row++;  
    16.     }  
    17.       
    18.     for(int i=0; i<size; i++) {  
    19.         for(int j=0; j<size; j++) {  
    20.             System.out.print(" " + kernalData[i][j]);  
    21.         }  
    22.         System.out.println();  
    23.         System.out.println("  ---------------------------");  
    24.     }  
    25.     return kernalData;  
    26. }  

    当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

    1.     // normalization  
    2.     float rate = inMax/outMax;  
    3.     System.out.println("Rate = " + rate);  
    4.     for(int row=0; row<height; row++) {  
    5.         for(int col=0; col<width; col++) {  
    6.             index = row * width + col;  
    7.             int rgb1 = tempoutPixels[index];  
    8. int red = (rgb1 >> 16) & 0xff;  
    9. int green = (rgb1 >> 8) & 0xff;  
    10. int blue = rgb1 & 0xff;  
    11. red = (int)(rate * red);  
    12. green = (int)(rate * green);  
    13. blue = (int)(rate * blue);  
    14. outPixels[index] = (rgb1 & 0xff000000) | (red << 16) | (green << 8) | blue;  
    15.         }  
    16.     }  

    高斯模糊效果如下:


     - 左边为原图                                                                                                                                                            - 右边为高斯模糊之后效果,发现皱纹和手部滑了

    等等现在还不最cool的效果,高斯模糊之后如果与原图像叠加会出现一种Glow的

    效果,好像灯光打在图像上一样,Glow处理之后的运行效果如下:

    原图:


    实现Glow Filter之后的图像:


    实现Glow算法只是高斯模糊输出像素值叠加原来的像素值。

    1. int index = 0;  
    2. for ( int y = 0; y < height; y++ ) {  
    3.     for ( int x = 0; x < width; x++ ) {  
    4.         int rgb1 = outPixels[index];  
    5.         int r1 = (rgb1 >> 16) & 0xff;  
    6.         int g1 = (rgb1 >> 8) & 0xff;  
    7.         int b1 = rgb1 & 0xff;  
    8.   
    9.         int rgb2 = inPixels[index];  
    10.         int r2 = (rgb2 >> 16) & 0xff;  
    11.         int g2 = (rgb2 >> 8) & 0xff;  
    12.         int b2 = rgb2 & 0xff;  
    13.   
    14.         r1 = PixelUtils.clamp( (int)(r1 + a * r2) );  
    15.         g1 = PixelUtils.clamp( (int)(g1 + a * g2) );  
    16.         b1 = PixelUtils.clamp( (int)(b1 + a * b2) );  
    17.   
    18.         inPixels[index] = (rgb1 & 0xff000000) | (r1 << 16) | (g1 << 8) | b1;  
    19.         index++;  
    20.     }  
    21. }  

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    vim配置文件
    NGUI屏幕自适应解决方案
    配置java环境
    Ignore files which are already versioned
    Unity3D TestTool Part _1
    c# 语法
    Application.persistentDataPath 的一个小坑
    Unity3D Log 收集机制
    Android 问题流水总结
    Open Phone, SMS, Email, Skype and Browser apps of Android in Unity3d
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706374.html
Copyright © 2011-2022 走看看