图像处理之图像加噪

简介: 图像处理之图像加噪

图像噪声源于现实世界中数字信号总会受到各种各样的干扰,最终接受的图像和源于的数字信号之间总

是存在一定的差异,对于图像噪声,使用均值滤波和中值滤波来消除图像噪声的做法已经是很常见的图

像消噪手段。

一:图像加噪原理

1.     椒盐噪声(Salt And Pepper Noise)

椒盐噪声是一种因为信号脉冲强度引起的噪声,信噪比(Signal NoiseRate)是衡量图像噪声的一个数字指标。


给一副数字图像加上椒盐噪声的处理顺序应该如下:

  1. 指定信噪比 SNR 其取值范围在[0, 1]之间
  2. 计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * (1-SNR)
  3. 随机获取要加噪的每个像素位置P(i, j)
  1. 指定像素值为255或者0。
  2. 重复c, d两个步骤完成所有像素的NP个像素
  3. 输出加噪以后的图像

 

2.     高斯噪声(Gaussian Noise)

高斯噪声的密度取决于公式G(x, sigma) 其中X是代表平均值,sigma代表的标准方差,每个输入像素 Pin,


一个正常的高斯采样分布公式G(d), 得到输出像素Pout.


      Pout = Pin + XMeans + sigma *G(d)


其中d为一个线性的随机数,G(d)是随机数的高斯分布随机值。


给一副数字图像加上高斯噪声的处理顺序如下:


a.      输入参数sigam 和 X mean


b.      以系统时间为种子产生一个伪随机数


c.      将伪随机数带入G(d)得到高斯随机数


d.      根据输入像素计算出输出像素


e.      重新将像素值防缩在[0 ~ 255]之间


f.       循环所有像素


g.      输出图像



二:关键程序解析


1.     椒盐噪声


根据信噪比,获取要加入椒盐噪声的像素数目


int size= (int)(inPixels.length * (1-SNR));



随机得到像素,完成椒盐噪声的加入


for(int i=0; i<size; i++) {


int row = (int)(Math.random()* (double)height);


int col = (int)(Math.random()* (double)width);


index= row * width + col;


inPixels[index]= (255 << 24) | (255 << 16) | (255 << 8) | 255;


}



2.     高斯噪声


根据标准方差,和伪随机数的范围,首先计算出一个伪随机数d ,根据d得到高斯分布的随机数值,整个代码如下:


   float d = (float)Math.random()*RANDOM_SCOPE - RANDOM_SCOPE/2;


   float sigma2 = sigma*sigma*2;


   float PI2 = (float)Math.PI * 2;


   float sigmaPI2 = (float)Math.sqrt(PI2*sigma);


   float result = (float)Math.exp(-d/sigma2)/sigmaPI2;


伪随机数的范围为[-127~ 127]之间。



获取高斯噪声的像素代码如下:


tr = (int)((float)tr + getGaussianValue() + this.means);


tg = (int)((float)tg + getGaussianValue() + this.means);


tb = (int)((float)tb + getGaussianValue() + this.means);


mean是的值为0.

三:程序效果如下


加入白色椒盐噪声的图片

0_1325835760jBTo.png

加入高斯噪声的图片

0_1325835782ATz1.png


椒盐噪声的代码如下:

  private BufferedImage addSaltAndPepperNoise(BufferedImage src, BufferedImage dst) {
    int width = src.getWidth();
        int height = src.getHeight();
 
        if ( dst == null )
            dst = createCompatibleDestImage( src, null );
 
        int[] inPixels = new int[width*height];
        getRGB( src, 0, 0, width, height, inPixels );
        
        int index = 0;
        int size = (int)(inPixels.length * (1-SNR));
 
        for(int i=0; i<size; i++) {
          int row = (int)(Math.random() * (double)height);
          int col = (int)(Math.random() * (double)width);
          index = row * width + col;
          inPixels[index] = (255 << 24) | (255 << 16) | (255 << 8) | 255;
        }
 
        setRGB( dst, 0, 0, width, height, inPixels );
        return dst;
  }

高斯噪声的代码如下:

private BufferedImage gaussianNoise(BufferedImage src, BufferedImage dst) {
    int width = src.getWidth();
        int height = src.getHeight();
 
        if ( dst == null )
            dst = createCompatibleDestImage( src, null );
 
        int[] inPixels = new int[width*height];
        int[][][] tempPixels = new int[height][width][4]; 
        int[] outPixels = new int[width*height];
        getRGB( src, 0, 0, width, height, inPixels );
        int index = 0;
        float inMax = 0;
        float outMax = 0;
        for(int row=0; row<height; row++) {
          int ta = 0, tr = 0, tg = 0, tb = 0;
          for(int col=0; col<width; col++) {
            index = row * width + col;
            ta = (inPixels[index] >> 24) & 0xff;
                tr = (inPixels[index] >> 16) & 0xff;
                tg = (inPixels[index] >> 8) & 0xff;
                tb = inPixels[index] & 0xff;
                if(inMax < tr) {
                  inMax = tr;
                }
                if(inMax < tg) {
                  inMax = tg;
                }
                if(inMax < tb) {
                  inMax = tb;
                }
                tr = (int)((float)tr + getGaussianValue() + this.means);
                tg = (int)((float)tg + getGaussianValue() + this.means);
                tb = (int)((float)tb + getGaussianValue() + this.means);
                if(outMax < tr) {
                  outMax = tr;
                }
                if(outMax < tg) {
                  outMax = tg;
                }
                if(outMax < tb) {
                  outMax = tb;
                }
                tempPixels[row][col][0] = ta;
                tempPixels[row][col][1] = tr;
                tempPixels[row][col][2] = tg;
                tempPixels[row][col][3] = tb;
          }
        }
 
        // Normalization
        index = 0;
        float rate = inMax/outMax;
        for(int row=0; row<height; row++) {
          int ta = 0, tr = 0, tg = 0, tb = 0;
          for(int col=0; col<width; col++) {
            index = row * width + col;
            ta = tempPixels[row][col][0];
            tr = tempPixels[row][col][1];
            tg = tempPixels[row][col][2];
            tb = tempPixels[row][col][3];
 
            tr = (int)((float)tr * rate);
            tg = (int)((float)tg * rate);
            tb = (int)((float)tb * rate);
            outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
          }
        }
        setRGB( dst, 0, 0, width, height, outPixels );
        return dst;
  }

相关文章
|
数据采集 PyTorch 数据处理
Pytorch学习笔记(3):图像的预处理(transforms)
Pytorch学习笔记(3):图像的预处理(transforms)
2517 1
Pytorch学习笔记(3):图像的预处理(transforms)
|
Python
python中3种获取cookie解决方案
python中3种获取cookie解决方案
510 0
|
机器学习/深度学习
神经网络与深度学习---验证集(测试集)准确率高于训练集准确率的原因
本文分析了神经网络中验证集(测试集)准确率高于训练集准确率的四个可能原因,包括数据集大小和分布不均、模型正则化过度、批处理后准确率计算时机不同,以及训练集预处理过度导致分布变化。
|
存储 编解码 开发工具
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
本文详细探讨了在Android平台上实现HTTP-FLV播放器的过程。首先介绍了FLV格式的基础,包括文件头和标签结构。接着分析了HTTP-FLV传输原理,通过分块传输实现流畅播放。然后重点讲解了播放器的实现步骤,涵盖网络请求、数据解析、音视频解码与渲染,以及播放控制功能的设计。文章还讨论了性能优化和网络异常处理的方法,并总结了HTTP-FLV播放器的技术价值,尤其是在特定场景下的应用意义。
747 11
|
Kubernetes 监控 算法
Kubernetes 调度器优化
Kubernetes 调度器优化
1686 0
|
芯片
电路学习笔记
这篇文章是关于电路学习笔记的详细记录,涵盖了电源部分、ESP32部分、IMU部分和舵机部分等多个方面。内容包括对2S锂电池、电流检测放大器、低压差线性稳压器、直流电压转换器、ESP32-S3-WROOM-1模块、IMU型号QMI8658C、舵机总线通讯、MEMS麦克风、TF卡、音频放大器、eMMC、Camera Connectors和MicroHDMI接口等组件的功能分析和使用说明。
379 1
|
机器学习/深度学习 编解码 自动驾驶
低质多模态数据融合,多家机构联合出了篇综述论文
【5月更文挑战第20天】这篇联合发布的综述论文聚焦于低质多模态数据融合的挑战,提出了一套分类体系,揭示了数据噪声、缺失值、不平衡及质量动态变化四大难题。论文回顾了各种融合方法,包括特征融合、决策融合和深度学习,但强调仍有未解决的问题,如噪声鲁棒性和缺失值处理。此外,它也讨论了实际应用中的挑战,如时间尺度差异、空间分辨率不匹配和隐私保护,为未来研究指明方向。[arXiv:2404.18947]
582 1
|
存储 传感器 编解码
CVPR 2023 最全分割类论文整理:图像/全景/语义/实例分割等【附PDF+代码】
CVPR 2023 最全分割类论文整理:图像/全景/语义/实例分割等【附PDF+代码】
2152 1
【idea中Activiti BPMN visualizer插件和Camunda Modeler工作流设计器的简单使用】
【idea中Activiti BPMN visualizer插件和Camunda Modeler工作流设计器的简单使用】
4363 1
|
Serverless 计算机视觉
OpenCV(二十二):均值滤波、方框滤波和高斯滤波
OpenCV(二十二):均值滤波、方框滤波和高斯滤波
839 1