图像处理之高斯模糊

简介: 图像处理之高斯模糊

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

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

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

0_13284239677foc.png


其中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


两维的高斯分布函数为:

0_132842411591QN.png

对应的Java实现代码为:

  public float[][] get2DKernalData(int n, float sigma) {
    int size = 2*n +1;
    float sigma22 = 2*sigma*sigma;
    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 = i*i;
        float yDistance = j*j;
        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;
  }


当n=1, sigma=1时对应输出的Kernel数据为:


   0.058549833   0.09653235     0.058549833


   0.09653235     0.15915494     0.09653235


   0.058549833   0.09653235     0.058549833


一个2D高斯分布的图可以表示如下:

0_13284242238wO8.png

高斯过滤在图像处理是一种低通滤波,会除去图像的细节而保持整体不变化,在图像美化和特效


方面,高斯过滤有这很多应用。高斯模糊不同于均值模糊!



本文实现完整的高斯模糊算法包括下面几个步骤:


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;
          }
        }

高斯模糊效果如下:

0_1328424429dWPh.png

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


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


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


原图:

0_13284245408c4Z.png


实现Glow Filter之后的图像:

0_1328424693c17f.png

实现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++;
      }
    }

转载时请注明出处!!,谢谢!

相关文章
|
4月前
|
计算机视觉
【图像处理】基于灰度矩的亚像素边缘检测方法理论及MATLAB实现
基于灰度矩的亚像素边缘检测方法,包括理论基础和MATLAB实现,通过计算图像的灰度矩来精确定位边缘位置,并提供了详细的MATLAB代码和实验结果图。
103 6
|
4月前
|
计算机视觉
【图像处理】 Halcon 实现图像亚像素边缘检测
如何在Halcon软件中实现图像亚像素边缘检测,包括读取图片、图像阈值化、边界提取、区域扩张、亚像素边缘提取、轮廓拟合和彩色绘图等步骤,并提供了相应的Halcon代码实现和检测效果展示。
120 2
|
6月前
|
算法 计算机视觉
图像处理之基于一维高斯快速模糊
图像处理之基于一维高斯快速模糊
31 8
|
6月前
|
算法 计算机视觉
图像处理之错切变换
图像处理之错切变换
99 1
|
6月前
|
算法 计算机视觉
图像处理之移动模糊
图像处理之移动模糊
36 0
|
6月前
|
算法 C语言 计算机视觉
图像处理之图像快速插值放缩算法
图像处理之图像快速插值放缩算法
37 0
|
6月前
|
算法 BI 计算机视觉
图像处理之积分图应用一(半径无关的快速模糊算法)
图像处理之积分图应用一(半径无关的快速模糊算法)
46 0
|
7月前
|
算法 计算机视觉
OpenCV高斯差分技术实现图像边缘检测
OpenCV高斯差分技术实现图像边缘检测
|
机器学习/深度学习 传感器 算法
不同颜色空间中的鲁棒边缘检测附matlab代码
不同颜色空间中的鲁棒边缘检测附matlab代码
|
资源调度 算法 API
OpenCV_06 图像平滑:图像噪声+图像平滑+滤波
由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。
140 0