图像处理之添加高斯与泊松噪声

来源:互联网 发布:wireshark过滤端口抓包 编辑:程序博客网 时间:2024/04/26 14:08

from: http://blog.csdn.net/jia20003/article/details/8258052


数学基础:

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

式如下:


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

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

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

 二:程序实现

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

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

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

我翻译成Java的。

三:程序效果


滤镜源代码:

[java] view plaincopy
  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. }  
转载文章请注明

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

1
0
主题推荐
图像处理
猜你在找
JavaScript for Qt Quick(QML)
Java Swing、JDBC开发桌面级应用
JavaScript DOM编程
Citrix Provisioning Services 7.1 管理
Flash实战技能应用从入门到精通
查看评论
5楼 CRAZYDooo2015-04-29 21:36发表 [回复]
楼主,看完了你的博客,感觉每篇都有用到一些未给出定义的方法,想看下具体实施过程,能给一下完整的代码吗?
我的邮箱:
iltvxqsj@163.com
谢谢!
4楼 u0111353082014-12-20 14:05发表 [回复]
最近在学数字图像处理,看了你的代码有好多函数不知道作用是什么,楼主可以给我发一份完整的代码吗?邮箱490349699@qq.com,谢谢!
3楼 xchang19852014-02-17 12:39发表 [回复]
你好,一直在浏览您的博客,您的代码对我java的图像处理毕业设计很有用,麻烦您吧AbstractBufferedImageOp 类发我一份吗,谢谢514506915@qq.com
2楼 青石桥边2014-02-09 15:44发表 [回复]
你好,我正在做关于图像去噪的毕设,想请您给我发一份AbstractBufferedImageOp 类,感觉您的这个类应该是在读取图片,但我不知道具体怎么写,有时间的话麻烦您给我发lg920810@163邮箱 非常感谢!
Re: gloomyfish2014-02-10 10:10发表 [回复]
晚上发你回复u013124795:
Re: apocalypse_joe2014-02-11 21:15发表 [回复]
回复jia20003:楼主你好 读了你的博客收获很大 但理解能力有限、想看下完整的代码 同求AbstractBufferedImageOp 类 邮箱是1269670921@qq.com 再次感谢
Re: gloomyfish2014-02-17 14:48发表 [回复]
发给你啦!回复u010278682:
1楼 xiaojidan20112012-12-25 10:50发表 [回复] [引用][举报]
楼主 有c代码的吗

0 0
原创粉丝点击