2019-11-19 12:52:55 qq_29598161 阅读数 33

要求

对一副图像加噪,进行几何均值,算术均值,谐波,逆谐波处理

待处理图像:

在这里插入图片描述
加噪声函数:

def add_gaussian_noise(image_in, noise_sigma=25):
    temp_image = np.float64(np.copy(image_in))

    h = temp_image.shape[0]
    w = temp_image.shape[1]
    noise = np.random.randn(h, w) * noise_sigma

    noisy_image = np.zeros(temp_image.shape, np.float64)
    if len(temp_image.shape) == 2:
        noisy_image = temp_image + noise
    else:
        noisy_image[:, :, 0] = temp_image[:, :, 0] + noise
        noisy_image[:, :, 1] = temp_image[:, :, 1] + noise
        noisy_image[:, :, 2] = temp_image[:, :, 2] + noise
    """
    print('min,max = ', np.min(noisy_image), np.max(noisy_image))
    print('type = ', type(noisy_image[0][0][0]))
    """
    return noisy_image

def sp_noisy(image, s_vs_p=0.5, amount=0.08):
    out = np.copy(image)
    num_salt = np.ceil(amount * image.size * s_vs_p)
    coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
    out[tuple(coords)] = 255
    num_pepper = np.ceil(amount * image.size * (1. - s_vs_p))
    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
    out[tuple(coords)] = 0
    return out

噪声图

高斯噪声:
在这里插入图片描述
盐噪声:
在这里插入图片描述
胡椒噪声:
在这里插入图片描述

滤波函数

def filter(image, op):
    new_image = np.zeros(image.shape)
    image = cv2.copyMakeBorder(image, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
    for i in range(1, image.shape[0] - 1):
        for j in range(1, image.shape[1] - 1):
            new_image[i - 1, j - 1] = op(image[i - 1:i + 2, j - 1:j + 2])
    new_image = (new_image - np.min(image)) * (255 / np.max(image))
    return new_image.astype(np.uint8)

几何均值滤波器

几何均值可由如下模板进行卷积求得,第三次作业已求过

k1 = np.array([
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]
], np.float32)/9

算术均值滤波器

操作函数:

def GeometricMeanOperator(roi):
    roi = roi.astype(np.float64)
    p = np.prod(roi)
    re = p ** (1 / (roi.shape[0] * roi.shape[1]))
    if re < 0:
        re = 0
    if re > 255:
        re = 255
    return re

效果

高斯:
在这里插入图片描述
盐噪声:
在这里插入图片描述
胡椒噪声
在这里插入图片描述
几何均值不适用于胡椒噪声

谐波均值滤波器

操作函数:

def HMeanOperator(roi):
    roi = roi.astype(np.float64)
    re = roi.shape[0] * roi.shape[1] / np.sum([1/(p+0.0001) for p in roi])
    if re < 0:
        re = 0
    if re > 255:
        re = 255
    return re

效果

高斯:
在这里插入图片描述
盐噪声:
在这里插入图片描述
胡椒噪声:
在这里插入图片描述
谐波均值也不适用于胡椒噪声

逆谐波均值滤波器

操作函数:

def IHMeanOperator(roi, q):
    roi = roi.astype(np.float64)
    return np.mean(roi ** (q + 1)) / np.mean(roi ** q)


def IHMeanAlogrithm(image, q):
    new_image = np.zeros(image.shape)
    image = cv2.copyMakeBorder(image, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
    for i in range(1, image.shape[0] - 1):
        for j in range(1, image.shape[1] - 1):
            new_image[i - 1, j - 1] = IHMeanOperator(image[i - 1:i + 2, j - 1:j + 2], q)
    new_image = (new_image - np.min(image)) * (255 / np.max(image))
    return new_image.astype(np.uint8)

效果

q>0时消除胡椒噪声:
在这里插入图片描述
q<0时消除盐噪声:
在这里插入图片描述

2015-06-02 18:07:21 gggg_ggg 阅读数 1246

Part One :图像加噪原理

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

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

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

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

    加入白色椒盐噪声的图片

     

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.

        图像噪声源于现实世界中数字信号总会受到各种各样的干扰,最终接受的图像和源于的数字信号之间总是存在一定的差异,对于图像噪声,使用均值滤波和中值滤波来消除图像噪声的做法已经是很常见的图像消噪手段。


2012-01-06 15:53:38 jia20003 阅读数 26447

 

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

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

像消噪手段。

 

一:图像加噪原理

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

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

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

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

 

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.

 

三:程序效果如下


加入白色椒盐噪声的图片

 


加入高斯噪声的图片



椒盐噪声的代码如下:

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



2014-08-17 16:48:17 littleThink 阅读数 4021

在图像处理时,所谓的去除图像噪声,难免要了解噪声的数学模型和建立噪声图像,从而实现模拟去噪过程和结果。


微笑噪声模型:本文仅介绍常用的高斯噪声和椒盐噪声

由于Opencv没有提供图像加噪方面的函数,在Opencv中自己建立噪声模型吃力不讨好,因此本文采用MATLAB实现图像加噪:


imnoise-在图像上加噪声【1】

 J = imnoise(I,TYPE,...)  Add noise of a given TYPE to the intensity image  I. TYPE is a string that can have one of these values:

其中,后面所有参数都被规格化,与灰度值均在0~1之间的图像相匹配。
 
        'gaussian'       Gaussian white noise with constant  mean and variance

e.g: 高斯白噪声, M为均值,V为方差

J = imnoise(I,'gaussian',M,V) adds Gaussian white noise of mean M and  variance V to the image I. When unspecified, M and V default to 0 and  0.01 respectively.

        'localvar'       Zero-mean Gaussian white noise  with an intensity-dependent variance

e.g1: 高斯白噪声,均值为0,V为与I维数相同,表示局部方差。

 J = imnoise(I,'localvar',V) adds zero-mean, Gaussian white noise of  local variance, V, to the image I.  V is an array of the same size as I.

e.g2: 高斯白噪声,均值为0,

IMAGE_INTENSITY为规格化的灰度值矩阵,数值范围为0~1,

IMAGE_INTENSITY和VAR

维数相同,Plot函数绘制噪声与灰度关系。

J = imnoise(I,'localvar',IMAGE_INTENSITY,VAR) adds zero-mean, Gaussian noise to an image, I, where the local variance of the noise is a  function of the image intensity values in I.  IMAGE_INTENSITY and VAR  are vectors of the same size, and PLOT(IMAGE_INTENSITY,VAR) plots the   functional relationship between noise variance and image intensity.   IMAGE_INTENSITY must contain normalized intensity values ranging from 0  to 1.

        'poisson'        Poisson noise

e.g: 泊松噪声

 J = imnoise(I,'poisson') generates Poisson noise from the data instead of adding artificial noise to the data.  If I is double precision,  then input pixel values are interpreted as means of Poisson distributions scaled up by 1e12.  For example, if an input pixel has the value 5.5e-12, then the corresponding output pixel will be generated from a Poisson distribution with mean of 5.5 and then scaled back down by 1e12.  If I is single precision, the scale factor used is 1e6.  If I is uint8 or uint16, then input pixel values are used directly without scaling.  For example, if a pixel in a uint8 input has the value 10, then the corresponding output pixel will be generated from a Poisson distribution with mean 10.

        'salt & pepper'  "On and Off" pixels

e.g: 椒盐噪声,D为噪声密度,默认值0.05

 J = imnoise(I,'salt & pepper',D) adds "salt and pepper" noise to the image I, where D is the noise density.  This affects approximately D*numel(I) pixels. The default for D is 0.05.
        'speckle'        Multiplicative noise

e.g: 乘法噪声

 J = imnoise(I,'speckle',V) adds multiplicative noise to the image I, using the equation J = I + n*I, where n is uniformly distributed random noise with mean 0 and variance V. The default for V is 0.04.



更多内容使用MATLAB help命令


微笑实例:

1.高斯白噪声:

>> I=imread('lena.jpg');
>> J=rgb2gray(I);
>> X=imnoise(I,'gaussian',0.5,0.1); %彩色图像加高斯白噪声
>> Y=imnoise(J,'gaussian',0.5,0.1); %灰度图像加高斯白噪声
>> imshow(I),figure,imshow(X);
>> figure,imshow(J),figure,imshow(Y);

2.椒盐噪声:

>> I=imread('lena.jpg');
>> J=rgb2gray(I);
>> X=imnoise(I,'salt & pepper',0.2);%彩色图像添加椒盐噪声
>> Y=imnoise(J,'salt & pepper',0.2);%灰度图像添加椒盐噪声
>> imshow(I),figure,imshow(X);
>> figure,imshow(J),figure,imshow(Y);

参考文献:

1.详解MATLAB图像函数及其应用-

2013-11-30 17:05:40 wbango 阅读数 4614

摘要:图像加噪,以及各种滤波

1、线性平滑滤波器
% 用MATLAB实现领域平均法抑制噪声程序
clear
clc
I=imread('lena.jpg ');
subplot(231),imshow(I);title('原始图像');
% I=rgb2gray(I);  %如果是rgb图像,需要这一步
I1=imnoise(I,'salt & pepper',0.02);   % 图像加噪
subplot(232),imshow(I1);title(' 添加椒盐噪声的图像')
k1=filter2(fspecial('average',3),I1)/255;          %进行3*3模板平滑滤波
k2=filter2(fspecial('average',5),I1)/255;          %进行5*5模板平滑滤波
k3=filter2(fspecial('average',7),I1)/255;          %进行7*7模板平滑滤波
k4=filter2(fspecial('average',9),I1)/255;          %进行9*9模板平滑滤波
subplot(233),imshow(k1);title('3*3 模板平滑滤波');
subplot(234),imshow(k2);title('5*5 模板平滑滤波');
subplot(235),imshow(k3);title('7*7 模板平滑滤波');
subplot(236),imshow(k4);title('9*9 模板平滑滤波');


2、中值滤波

clear
clc
I=imread('lena.jpg ');
% I=rgb2gray(I);
J=imnoise(I,'salt & pepper',0.02);
subplot(231),imshow(I);title('原图像');
subplot(232),imshow(J);title('添加椒盐噪声图像');
k1=medfilt2(J);              %进行3*3模板中值滤波
k2=medfilt2(J,[5,5]);      %进行5*5模板中值滤波
k3=medfilt2(J,[7,7]);      %进行7*7模板中值滤波
k4=medfilt2(J,[9,9]);      %进行9*9模板中值滤波
subplot(233),imshow(k1);title('3*3模板中值滤波');
subplot(234),imshow(k2);title('5*5模板中值滤波 ');
subplot(235),imshow(k3);title('7*7模板中值滤波');
subplot(236),imshow(k4);title('9*9 模板中值滤波');


3、维纳滤波,中值滤波

clear
clc
I=imread('lena.jpg');
J=imnoise(I,'gaussian',0,0.01);  % 加高斯噪声
K=wiener2(J,[5,5]);  % 进行维纳滤波
L=medfilt2(J);    % 进行中值滤波
figure
subplot(221),imshow(I,[]),title('原图');
subplot(222),imshow(J,[]),title('加高斯噪声');
subplot(223),imshow(K),title('维纳滤波');
subplot(224),imshow(L),title('中值滤波');


4、特定区域滤波

% 对指定区域进行锐化滤波的程序

I=imread('eight.tif');
c=[222 272 300 272 222 194];
r=[21 21 75 121 121 75];
BW=roipoly(I,c,r);
h=fspecial('unsharp');
J=roifilt2(h,I,BW);
subplot(1,2,1);imshow(I);
subplot(1,2,2);imshow(J);

PS: Matlab还有许多相关滤波器,相关的函数与用法请查阅帮助文件。

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