2019-09-14 17:23:52 weixin_44225182 阅读数 3171
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

添加高斯噪声

概念
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。高斯白噪声包括热噪声和散粒噪声。在通信信道测试和建模中,高斯噪声被用作加性白噪声以产生加性白高斯噪声。

我的理解:高斯噪声就是符合高斯分布的噪声,在数字图像处理这块就是二维的高斯分布(正态分布)。那么怎么添加高斯噪声呢?首先我们肯定要得到一个二维的、符合高斯分布的噪声矩阵,最后将其添加到原图像上。这样高斯噪声就添加成功了。

方法一:利用randn()函数生成高斯噪声
这里需要用到randn()函数,该函数就专门用来生成正态分布数据的一个函数。
比如 randn(10,10),然后这个矩阵和原图像矩阵相加即可(注意缩放灰度范围)

randn(10,10)

ans =

   -0.3587    0.6694    0.2922    0.4127   -0.4399   -0.2027    1.2917   -1.2807    0.0522   -0.2097
    1.4851   -0.2349   -0.0809   -1.0475    0.4734   -0.8012   -1.3658   -2.4489    1.2525   -0.0725
    0.1214    0.2553    0.2774   -0.9508   -0.3378   -1.1350    0.7951   -0.6749   -0.1797   -0.5646
   -0.7056    1.5769   -0.8234    1.5896    1.5743    0.1304   -0.3575   -1.0971   -0.2286   -1.5035
    1.4605    0.6227   -0.6059    1.5939    0.0120   -0.1012   -0.9397   -1.6988   -2.3375    1.0503
   -0.2038    0.7016    0.7310   -0.4053   -0.0419   -0.3276   -0.7675    0.6319    0.3662   -1.0595
   -1.3164    0.1579    0.3200   -0.2055    0.5508   -0.6350    0.7769    1.1788    1.1854   -1.0070
    0.1054    1.0071    0.4267    0.6462   -1.1893   -1.8829   -1.2166   -0.2838    1.0378    0.8280
    0.9141   -1.5962   -0.0540    1.5489    1.0449    0.6155   -0.6227    0.2447    0.2955   -0.7770
   -0.7474    0.6233    1.3306   -0.2167   -0.2423    1.3778   -1.0203   -1.1946    0.4893    0.0451

代码:

t=imread('a1.jpg');
[m,n,z]=size(t);
y=0+0.1*randn(m,n);%二维高斯分布矩阵 0是均值 0.1是标准差

%先将其double化,再除以255 便于后面计算
t1=double(t)/255;

%加上噪声
t1=t1+y;

%将像素范围扩大至0--255
t1=t1*255;

%转换为uint8类型
t1=uint8(t1);

subplot(1,2,1),imshow(t),title('原图');
subplot(1,2,2),imshow(t1),title('加入均值为0,标准差为0.1的高斯噪声后');

效果图:
在这里插入图片描述
方法二:随机生成高斯噪声(这个我还没有懂那个随机生成高斯噪声函数怎么来的!)
代码:

 image=imread('a1.jpg');
[width,height,z]=size(image);
subplot(1,2,1);
imshow(image);
title('原图');
av=0;
std=0.1;
u1=rand(width,height);
u2=rand(width,height);
x=std*sqrt(-2*log(u1)).*cos(2*pi*u2)+av;
result1=double(image)/255+x;
result1=uint8(255*result1);
subplot(1,2,2);
imshow(result1);
title('加入均值为0,标准差为0.1的高斯噪声后');

效果图:
在这里插入图片描述

方法三:利用imnoise()函数
代码

t=imread('a1.jpg');
imshow(t),title('原图');
t1=imnoise(t,'gaussian',0,0.01);
figure,imshow(t1),title('添加均值为0,方差为0.01的高斯噪声');
t2=imnoise(t,'gaussian',0,0.02);
figure,imshow(t2),title('添加均值为0,方差为0.02的高斯噪声');
t3=imnoise(t,'gaussian',0,0.03);
figure,imshow(t3),title('添加均值为0,方差为0.03的高斯噪声');
t4=imnoise(t,'gaussian',0.2,0.01);
figure,imshow(t4),title('添加均值为0.2,方差为0.01的高斯噪声');
t5=imnoise(t,'gaussian',0.4,0.01);
figure,imshow(t5),title('添加均值为0.4,方差为0.01的高斯噪声');

效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:imnoise()中参数写的是方差,而方法一、二中是标准差。

更多

获取更多资料、代码,微信公众号:海轰Pro
回复 海轰 即可

2018-04-11 00:35:51 qq_36969386 阅读数 369
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

    课上作业要求利用C里面的自带类库对图像做一个高斯噪声的生成,记录一下大概的原理和步骤。


    首先是对高斯函数的理解

   

    这个函数是一个高斯概率密度的分布表达式,表示为X~N(μ,σ²),其中μ表示均值,σ²表示方差,当μ=0,σ²=1时为标准正态分布。

    而高斯噪声是要求生成的噪声的概率密度函数符合高斯分布。我觉得可以理解为所有的噪声采样服从高斯分布的一种噪声。有关高斯噪声和高斯白噪声的理解参考

   hudalikm的一篇有关高斯噪声的文章文章

    高斯噪声的生成就是在图像所有像素上添加一个噪声信号:

        n(x,y)=o(x,y)+g(x,y)

    其关键是如何生成这个g(x,y)。当然x和y只是表示图像像素的坐标,对原像素值加上一个高斯采样值就可以生成一个高斯噪声。计算机中生成高斯采样的方法有很多,这里我使用的是比较常用的Box-Muller方法。该方法原理涉及到统计学的各种问题(反正我看一遍没太看懂),但实现过程非常简单。

    原理的话在白马负金羁的文章中有介绍

    使用方法是首先生成两个数a,b为在[0,1]的均匀分布随机采样;

    根据box-muller方法,对a,b做如下运算可以得到服从高斯分布的两个随机数

    使用任何一个都可以,我觉得这是二维的高斯采样,然后咱们在这里只需要选择任何一维都可以。

    最终生成的噪声点为

    n(x,y)=o(x,y)+(μ+N*σ);

    

接下来是利用CImage对图像进行处理阶段了


关于如何使用Cimage类的介绍,这里我参考了self_mind 的关于Cimage类的介绍 里面介绍的很详细。

下面我放上我的代码和效果图

宏定义和main函数部分

#include <atlimage.h>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MU 0			//均值
#define SIGMA 2			//方差
#define k 16
#define PI 3.1415926

using namespace std;
int addNoise(const CImage& input, CImage& noise);
double guass();
int makeNoise(CImage input);
int addNoise(const CImage& input, CImage& noise);
int main() {
	CString ImagePath = "E:\\1myRobotFile\\公式算法项目\\CameraCalibration\\input.jpg";
	CImage image, noise;
	//读入图片
	image.Load(ImagePath);
	makeNoise(image);

	cout << "successd" << endl;
	system("pause");

}
接下来是高斯噪声生成函数
double guass()
{
	//生成0-1的随机数
	double x1, x2;
	//生成0-1两个随机数
	x1 = rand() / ((double)RAND_MAX);
	x2 = rand() / ((double)RAND_MAX);
	if (x1 < 1e-100)
		x1 = 1e-100;
	x1 = (-2) * log(x1);
	x2 = x2 * PI * 2;
	double g = MU + (sqrt(x1) * cos(x2)) * SIGMA;

	//double g = MU + (sqrt(x1) * sin(x2)) * SIGMA;

	return g;
}

最后是输出高斯噪声模版和高斯噪声叠加图像

int makeNoise(CImage input)
{
	if (input == 0)
	{
		cout << "图片输入错误!" << endl;
		return 0;
	}

	//噪声图片的创建
	CImage gaussNoise, In;
	CString ImagePath = "E:\\1myRobotFile\\公式算法项目\\CameraCalibration\\input.jpg";
	In.Load(ImagePath);
	gaussNoise = input;
	//gaussNoise.Create(input.GetWidth(), input.GetHeight(), 8);
	//高斯噪音生成
	int r, g, b;
	for (int i = 0; i<gaussNoise.GetWidth(); i++)
	{
		for (int j = 0; j<gaussNoise.GetHeight(); j++)
		{
			r = guass();
			g = guass();
			b = guass();
			gaussNoise.SetPixelRGB(i, j, r, g, b);

		}
	}
	CString SImagePath = "E:\\1myRobotFile\\公式算法项目\\CameraCalibration\\noise.jpg";
	gaussNoise.Save(SImagePath);
	addNoise(In, gaussNoise);
}
//噪声和原图的相加
int addNoise(const CImage& input, CImage& noise)
{
	CImage addnoise;
	COLORREF pixel1;
	COLORREF pixel2;
	int r, g, b;
	if (input == 0 || noise == 0)
	{
		cout << "图片输入错误!" << endl;
		return 0;
	}
	addnoise = input;
	int w = addnoise.GetWidth();
	int h = addnoise.GetHeight();
	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j<h; j++)
		{
			pixel1 = input.GetPixel(i, j);
			pixel2 = noise.GetPixel(i, j);
			/*r = GetRValue(pixel1);
			g = GetGValue(pixel1);
			b = GetBValue(pixel1);
			cout << r << "," << g << "," << b << endl;*/
			//r = GetRValue(pixel1) + GetRValue(pixel2) - 128;
			//g = GetGValue(pixel1) + GetGValue(pixel2) - 128;
			//b = GetBValue(pixel1) + GetBValue(pixel2) - 128;
			r = GetRValue(pixel1) + GetRValue(pixel2) *k;
			g = GetGValue(pixel1) + GetGValue(pixel2) *k;
			b = GetBValue(pixel1) + GetBValue(pixel2) *k;

			//cout << r << "," << g << "," << b << endl; 
			if (r>255)
			{
				r = 255;
			}
			if (g>255)
			{
				g = 255;
			}
			if (b>255)
			{
				b = 255;
			}
			if (r<0)
			{
				r = 0;

			}
			if (g<0)
			{
				g = 0;
			}
			if (b<0)
			{
				b = 0;
			}
			addnoise.SetPixelRGB(i, j, r, g, b);
		}
	}
	CString SImagePath = "E:\\1myRobotFile\\公式算法项目\\CameraCalibration\\output.jpg";
	addnoise.Save(SImagePath);

}

效果图如下

原图


噪声图像(μ=0,σ=2)

带有高斯噪声的图像

2016-02-02 21:34:49 sunmc1204953974 阅读数 26118
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

高斯噪声

图像噪声之高斯噪声(gauss noise)

概述:

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声

与椒盐噪声相似(Salt And Pepper Noise),高斯噪声(gauss noise)也是数字图像的一个常见噪声。

椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。

算法步骤:

通过概率论里关于正态分布的有关知识可以很简单的得到其计算方法,高斯噪声的概率密度服从高斯分布(正态分布)其中有means(平均值)和sigma(标准方差)两个参数。

高斯分布(正态分布):

这里写图片描述

对于每个输入像素,我们可以通过与符合高斯分布的随机数相加, 得到输出像素:

   Pout = Pin + F(means,sigma)

获得一个符合高斯分布的随机数有好几种方法,比如最基本的一个方法是使用标准的正态累积分布函数的反函数。除此之外还有其他更加高效的方法,Box-Muller变换就是其中之一。另一个更加快捷的方法是ziggurat算法。

而python的random库也提供了产生高斯随机数的方法:

高斯分布
random.gauss(mu, sigma)
Gaussian distribution. mu is the mean, and sigma is the standard deviation. This is slightly faster than the normalvariate() function defined below.

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

  • a.设定参数sigma 和 Xmean

  • b.产生一个高斯随机数

  • c.根据输入像素计算出输出像素

  • d.重新将像素值限制或放缩在[0 ~ 255]之间

  • e.循环所有像素

  • f.输出图像。

编程实例:

# -*- coding: utf-8 -*-

from PIL import Image

from pylab import *

from numpy import*

import random

#读取图片并转为数组
im = array(Image.open('./source/test.jpg'))

#设定高斯函数的偏移
means = 0

#设定高斯函数的标准差
sigma = 25

#r通道
r = im[:,:,0].flatten()

#g通道
g = im[:,:,1].flatten()

#b通道
b = im[:,:,2].flatten()



#计算新的像素值
for i in range(im.shape[0]*im.shape[1]):

    pr = int(r[i]) + random.gauss(0,sigma)

    pg = int(g[i]) + random.gauss(0,sigma)

    pb = int(b[i]) + random.gauss(0,sigma)

    if(pr < 0):

    pr = 0

    if(pr > 255):

    pr = 255

    if(pg < 0):

    pg = 0

    if(pg > 255):

    pg = 255

    if(pb < 0):

    pb = 0

    if(pb > 255):

    pb = 255

    r[i] = pr


    g[i] = pg


    b[i] = pb


im[:,:,0] = r.reshape([im.shape[0],im.shape[1]])

im[:,:,1] = g.reshape([im.shape[0],im.shape[1]])

im[:,:,2] = b.reshape([im.shape[0],im.shape[1]])

#显示图像

imshow(im)

show()         

这里由于默认图像会被编码成无符号八位整数(unit8),所以当进行数值计算时,如果出现大于255和小于0的情况会进行滚动,比如255 + 10 = 9 ,如果不进行处理,结果是错误的,所以必须转成int计算,限制范围后再赋值回去,下面是直接运算造成的错误结果(sigma = 25):

# -*- coding: utf-8 -*-

from PIL import Image

from pylab import *

from numpy import*

import random

#读取图片并转为数组
im = array(Image.open('./source/test.jpg'))

#设定高斯函数的偏移
means = 0

#设定高斯函数的标准差
sigma = 25

#r通道
r = im[:,:,0].flatten()

#g通道
g = im[:,:,1].flatten()

#b通道
b = im[:,:,2].flatten()



#计算新的像素值
for i in range(im.shape[0]*im.shape[1]):


    r[i] = r[i] + random.gauss(0,sigma)


    g[i] = g[i] + random.gauss(0,sigma)


    b[i] = b[i] + random.gauss(0,sigma)


im[:,:,0] = r.reshape([im.shape[0],im.shape[1]])

im[:,:,1] = g.reshape([im.shape[0],im.shape[1]])

im[:,:,2] = b.reshape([im.shape[0],im.shape[1]])

#显示图像

imshow(im)

show()         

这里写图片描述

运行结果:


原图

这里写图片描述

sigma = 15

这里写图片描述

sigma = 25

这里写图片描述

sigma = 40

这里写图片描述

结语:

本篇博客主要介绍了高斯噪声这种常见的图像噪声的原理与生成,希望对大家有所帮助~

2017-08-03 11:49:49 u010368556 阅读数 13305
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

 http://blog.csdn.net/qq_34784753/article/details/69379135

 

下面简单介绍两种图像噪声,即椒盐噪声和高斯噪声。

1.椒盐噪声

       椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。盐和胡椒噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。图像模拟添加椒盐噪声是通过随机获取像素点并设置为高亮度点和低灰度点来实现的

2.高斯噪声

       高斯噪声是指高绿密度函数服从高斯分布的一类噪声。特别的,如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度有事均匀分布的,则称这个噪声为高斯白噪声。高斯白噪声二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。高斯噪声包括热噪声和三里噪声。高斯噪声万有由它的事变平均值和两瞬时的协方差函数来确定,若噪声是平稳的,则平均值与时间无关,而协方差函数则变成仅和所考虑的两瞬时之差有关的相关函数,在意义上它等同于功率谱密度。高斯早生可以用大量独立的脉冲产生,从而在任何有限时间间隔内,这些脉冲中的每一个买充值与所有脉冲值得总和相比都可忽略不计。

        根据Box-Muller变换原理,建设随机变量U1、U2来自独立的处于(0,1)之间的均匀分布,则经过下面两个式子产生的随机变量Z0,Z1服从标准高斯分布。


上式中Z0,Z1满足正态分布,其中均值为0,方差为1,变量U1和U2可以修改为下式:


给图像添加两种噪声的程序如下:

#include <cstdlib>  
#include <iostream>  
#include <opencv2\core\core.hpp>  
#include <opencv2\highgui\highgui.hpp>  
#include <opencv2\imgproc\imgproc.hpp>  

using namespace cv;
using namespace std;

double generateGaussianNoise(double m, double sigma);
Mat addSaltNoise(const Mat srcImage, int n);
Mat addGaussianNoise(Mat &srcImag);

int main()
{
	Mat srcImage = imread("imL.png");
	if (!srcImage.data)
	{
		cout << "读入图像有误!" << endl;
		system("pause");
		return -1;
	}
	imshow("原图像", srcImage);
	Mat dstImage1 = addSaltNoise(srcImage, 3000);
	Mat dstImage2 = addGaussianNoise(srcImage);
	imshow("添加椒盐噪声的图像", dstImage1);
	imshow("添加高斯噪声的图像", dstImage2);
	//存储图像  
	imwrite("salt_pepper_Image.jpg", dstImage1);
	imwrite("GaussianNoise_Image.jpg", dstImage2);
	waitKey();
	return 0;
}

Mat addSaltNoise(const Mat srcImage, int n)
{
	Mat dstImage = srcImage.clone();
	for (int k = 0; k < n; k++)
	{
		//随机取值行列  
		int i = rand() % dstImage.rows;
		int j = rand() % dstImage.cols;
		//图像通道判定  
		if (dstImage.channels() == 1)
		{
			dstImage.at<uchar>(i, j) = 255;       //盐噪声  
		}
		else
		{
			dstImage.at<Vec3b>(i, j)[0] = 255;
			dstImage.at<Vec3b>(i, j)[1] = 255;
			dstImage.at<Vec3b>(i, j)[2] = 255;
		}
	}
	for (int k = 0; k < n; k++)
	{
		//随机取值行列  
		int i = rand() % dstImage.rows;
		int j = rand() % dstImage.cols;
		//图像通道判定  
		if (dstImage.channels() == 1)
		{
			dstImage.at<uchar>(i, j) = 0;     //椒噪声  
		}
		else
		{
			dstImage.at<Vec3b>(i, j)[0] = 0;
			dstImage.at<Vec3b>(i, j)[1] = 0;
			dstImage.at<Vec3b>(i, j)[2] = 0;
		}
	}
	return dstImage;
}
//生成高斯噪声  
double generateGaussianNoise(double mu, double sigma)
{
	//定义小值  
	const double epsilon = numeric_limits<double>::min();
	static double z0, z1;
	static bool flag = false;
	flag = !flag;
	//flag为假构造高斯随机变量X  
	if (!flag)
		return z1 * sigma + mu;
	double u1, u2;
	//构造随机变量  
	do
	{
		u1 = rand() * (1.0 / RAND_MAX);
		u2 = rand() * (1.0 / RAND_MAX);
	} while (u1 <= epsilon);
	//flag为真构造高斯随机变量  
	z0 = sqrt(-2.0*log(u1))*cos(2 * CV_PI*u2);
	z1 = sqrt(-2.0*log(u1))*sin(2 * CV_PI*u2);
	return z0*sigma + mu;
}

//为图像添加高斯噪声  
Mat addGaussianNoise(Mat &srcImag)
{
	Mat dstImage = srcImag.clone();
	int channels = dstImage.channels();
	int rowsNumber = dstImage.rows;
	int colsNumber = dstImage.cols*channels;
	//判断图像的连续性  
	if (dstImage.isContinuous())
	{
		colsNumber *= rowsNumber;
		rowsNumber = 1;
	}
	for (int i = 0; i < rowsNumber; i++)
	{
		for (int j = 0; j < colsNumber; j++)
		{
			//添加高斯噪声  
			int val = dstImage.ptr<uchar>(i)[j] +
				generateGaussianNoise(0, 2.235) * 32;
			if (val < 0)
				val = 0;
			if (val>255)
				val = 255;
			dstImage.ptr<uchar>(i)[j] = (uchar)val;
		}
	}
	return dstImage;
}


2019-01-30 01:37:12 qq_42505705 阅读数 607
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

本文主要介绍给图像添加椒盐噪声高斯噪声,以及其代码实现除噪的方法

若要获取更多数字图像处理,python,深度学习,机器学习,计算机视觉等高清PDF以及 更多有意思的 分享,可搜一搜 微信公共号 “分享猿” 免费获取资源。也可扫描下面的二维码关注,期待你的到来~
在这里插入图片描述
一、椒盐噪声

椒盐噪声也称为脉冲噪声,是一种随机出现的白点(盐)或者黑点(椒),。盐和胡椒噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,产生胡椒噪声,饱和的感应器导致像素值为最大值,产生盐粒噪声。

如下图一幅电路图像以及加了椒盐噪声后的图像
           原图                  加椒盐噪声后的图像
在这里插入图片描述

二、高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。除常用抑制噪声的方法外,对高斯噪声的抑制方法常常采用数理统计方法。

下列是一幅加了高斯噪声的图像
在这里插入图片描述
三、代码实现

下列是实现椒盐噪声和高斯噪声的python代码
需要已经安装numpy和opencv-python库

import numpy as np
import cv2

#定义添加椒盐噪声的函数
def SaltAndPepperNoise(img,percetage):
    SP_NoiseImg=img
    SP_NoiseNum=int(percetage*img.shape[0]*img.shape[1])
    for i in range(SP_NoiseNum):
        randX=np.random.random_integers(0,img.shape[0]-1)
        randY=np.random.random_integers(0,img.shape[1]-1)
        if np.random.random_integers(0,1)==0:
            SP_NoiseImg[randX,randY]=0   #0为胡椒噪声
        else:
            SP_NoiseImg[randX,randY]=255    #1为盐粒噪声
    return SP_NoiseImg

#定义添加高斯噪声的函数
def addGaussianNoise(image,percetage):
    G_Noiseimg = image
    G_NoiseNum=int(percetage*image.shape[0]*image.shape[1])
    for i in range(G_NoiseNum):
        temp_x = np.random.randint(0,G_Noiseimg.shape[0])
        temp_y = np.random.randint(0,G_Noiseimg.shape[1])
        G_Noiseimg[temp_x][temp_y] = 255
    return G_Noiseimg


def main():
    img = cv2.imread(r"F:\image\Circuit.tif",1)
    cv2.namedWindow("Original image")
    cv2.imshow("Original image", img)
    grayImg = cv2.imread(r"F:\image\Circuit.tif",0)
    cv2.imshow("grayimage", grayImg)

    gauss_noiseImage = addGaussianNoise(grayImg, 0.1)  # 添加10%的高斯噪声
    cv2.imshow("Add_GaussianNoise Image", gauss_noiseImage)
    cv2.imwrite(r"C:\Users\xxx\Desktop\GaussianNoise Image1.jpg", gauss_noiseImage)

    SaltAndPepper_noiseImage = SaltAndPepperNoise(grayImg, 0.1)  # 添加10%的椒盐噪声
    cv2.imshow("Add_SaltAndPepperNoise Image", SaltAndPepper_noiseImage)
    cv2.imwrite(r"C:\Users\xxx\Desktop\SaltAndPepper_noiseImage1.jpg", gauss_noiseImage)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

main()

四、去噪处理

下面是给出对前文中 加过 椒盐噪声和高斯噪声的图像 分别进行图像去噪 处理
这里主要介绍下中值滤波均值滤波,并附带四种滤波的比较

中值滤波和均值滤波都可以起到平滑图像,具有去噪声的功能。
中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。
均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。

下列图像中左侧右侧分别是对上述加过椒盐噪声图像和加过高斯噪声图像使用特定滤波进行去噪处理 
 
中值滤波

mbImg = cv2.medianBlur(noise_im,3)

在这里插入图片描述  在这里插入图片描述
均值滤波

meanImg = cv2.blur(noise_im,(3,3))

在这里插入图片描述  在这里插入图片描述
高斯滤波

Img_GaussianBlur=cv2.GaussianBlur(noise_im,(3,3),0)

在这里插入图片描述  在这里插入图片描述
双边滤波

img_bilateralFilter=cv2.bilateralFilter(noise_im,40,75,75)

在这里插入图片描述   在这里插入图片描述

搜索公众号“分享猿”,并回复关键词“代码”,获取本文全部代码

留言或者公众号关注我,我们一起分享数字图像处理心得,一起交流学习吧~

没有更多推荐了,返回首页