• 图像处理------添加高斯与泊松噪声 分类: 视频图像处理 2015-07-24 14:58 61人阅读 评论(0) 收藏


    数学基础:

    什么是泊松噪声,就是噪声分布符合泊松分布模型。泊松分布(Poisson Di)的公

    式如下:


    关于泊松分布的详细解释看这里:http://zh.wikipedia.org/wiki/泊松分佈

    关于高斯分布与高斯噪声看这里:

    http://blog.csdn.net/jia20003/article/details/7181463

     二:程序实现

    以前在图像加噪博文中现实的加高斯噪声,比较复杂。是自己完全实现了高斯随

    机数的产生,这里主要是利用JAVA的随机数API提供的nextGaussion()方法来得

    到高斯随机数。泊松噪声为了简化计算,Google到一位神人完成的C++代码于是

    我翻译成Java的。

    三:程序效果


    滤镜源代码:

    1. package com.gloomyfish.filter.study;  
    2.   
    3. import java.awt.image.BufferedImage;  
    4. import java.util.Random;  
    5.   
    6. public class NoiseAdditionFilter extends AbstractBufferedImageOp {  
    7.     public final static double MEAN_FACTOR = 2.0;  
    8.     public final static int POISSON_NOISE_TYPE = 2;  
    9.     public final static int GAUSSION_NOISE_TYPE = 1;  
    10.     private double _mNoiseFactor = 25;  
    11.     private int _mNoiseType = POISSON_NOISE_TYPE;  
    12.       
    13.     public NoiseAdditionFilter() {  
    14.         System.out.println("Adding Poisson/Gaussion Noise");  
    15.     }  
    16.       
    17.     public void setNoise(double power) {  
    18.         this._mNoiseFactor = power;  
    19.     }  
    20.       
    21.     public void setNoiseType(int type) {  
    22.         this._mNoiseType = type;  
    23.     }  
    24.       
    25.     @Override  
    26.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
    27.         int width = src.getWidth();  
    28.         int height = src.getHeight();  
    29.         Random random = new Random();  
    30.         if ( dest == null )  
    31.             dest = createCompatibleDestImage( src, null );  
    32.   
    33.         int[] inPixels = new int[width*height];  
    34.         int[] outPixels = new int[width*height];  
    35.         getRGB( src, 00, width, height, inPixels );  
    36.         int index = 0;  
    37.         for(int row=0; row<height; row++) {  
    38.             int ta = 0, tr = 0, tg = 0, tb = 0;  
    39.             for(int col=0; col<width; col++) {  
    40.                 index = row * width + col;  
    41.                 ta = (inPixels[index] >> 24) & 0xff;  
    42.                 tr = (inPixels[index] >> 16) & 0xff;  
    43.                 tg = (inPixels[index] >> 8) & 0xff;  
    44.                 tb = inPixels[index] & 0xff;  
    45.                 if(_mNoiseType == POISSON_NOISE_TYPE) {  
    46.                     tr = clamp(addPNoise(tr, random));  
    47.                     tg = clamp(addPNoise(tg, random));  
    48.                     tb = clamp(addPNoise(tb, random));  
    49.                 } else if(_mNoiseType == GAUSSION_NOISE_TYPE) {  
    50.                     tr = clamp(addGNoise(tr, random));  
    51.                     tg = clamp(addGNoise(tg, random));  
    52.                     tb = clamp(addGNoise(tb, random));  
    53.                 }  
    54.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
    55.             }  
    56.         }  
    57.   
    58.         setRGB( dest, 00, width, height, outPixels );  
    59.         return dest;  
    60.     }  
    61.       
    62.     private int addGNoise(int tr, Random random) {  
    63.         int v, ran;  
    64.         boolean inRange = false;  
    65.         do {  
    66.             ran = (int)Math.round(random.nextGaussian()*_mNoiseFactor);  
    67.             v = tr + ran;  
    68.             // check whether it is valid single channel value  
    69.             inRange = (v>=0 && v<=255);   
    70.             if (inRange) tr = v;  
    71.         } while (!inRange);  
    72.         return tr;   
    73.     }  
    74.   
    75.     public static int clamp(int p) {  
    76.         return p > 255 ? 255 : (p < 0 ? 0 : p);  
    77.     }  
    78.       
    79.     private int addPNoise(int pixel, Random random) {  
    80.         // init:  
    81.         double L = Math.exp(-_mNoiseFactor * MEAN_FACTOR);  
    82.         int k = 0;  
    83.         double p = 1;  
    84.         do {  
    85.             k++;  
    86.             // Generate uniform random number u in [0,1] and let p ← p × u.  
    87.             p *= random.nextDouble();  
    88.         } while (p >= L);  
    89.         double retValue = Math.max((pixel + (k - 1) / MEAN_FACTOR - _mNoiseFactor), 0);  
    90.         return (int)retValue;  
    91.     }  
    92.   
    93. }  

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

  • 相关阅读:
    我们失去了,我们又没有失去什么
    人过 40
    KPI绩效考核为何在国内不管用?
    再也不必当心我的密码了,多个SAP 客户端自动输入密码
    大器晚成
    人际能量相吸定律
    SQL SERVER函数——表值函数的处理
    MS-SQL SERVER单列合并的四种常用方法
    实战 SQL Server 2008 数据库误删除数据的恢复
    唉,怎么一眨眼就老了!
  • 原文地址:https://www.cnblogs.com/mao0504/p/4705506.html
Copyright © 2020-2023  润新知