Adding Specific Ratio of Noise to an Image

7 visualizaciones (últimos 30 días)
Mohammed Abdul Wadood
Mohammed Abdul Wadood el 25 de Jul. de 2022
Editada: Mohammed Abdul Wadood el 28 de Jul. de 2022
How can I adding a noise (e.g 75% of gaussian noise) to an Image?
In (imnoise) function there is only the (mean & variance), I dont want to add (e.g gaussian noise with m = 0 & standard deviation of 75%), I want to add (e.g 75% of image or elements have noise and 25% don't). how can I do that?

Respuesta aceptada

DGM
DGM el 25 de Jul. de 2022
Editada: DGM el 25 de Jul. de 2022
The 'salt & pepper' option is the only option with a density parameter. Salt & Pepper noise will affect a specified fraction of the pixels in the image by slamming them to black/white.
inpict = imread('cameraman.tif');
outpict = imnoise(inpict,'salt & pepper',0.75);
imshow(outpict)
If you're trying to restrict some other type of noise by using a density parameter, then you'll have to write that yourself For example, if you wanted gaussian noise with a restricted density:
inpict = imread('cameraman.tif'); % a grayscale image
density = 0.75; % density
gaumean = 0; % mean
gauvar = 0.01; % variance
s0 = size(inpict);
inpict = im2double(inpict);
gnpict = inpict + gaumean + sqrt(gauvar)*randn(s0);
noisemask = rand(s0)<density;
nnz(noisemask)/numel(noisemask) % check the density
ans = 0.7504
outpict = inpict;
outpict(noisemask) = gnpict(noisemask);
imshow(outpict)
Bear in mind that doing this density restriction alters the noise variance. If you want to specify the final variance instead of the variance of the image prior to sampling, you'll have to take that into account.
% adjust variance to compensate for density
gnpict = inpict + gaumean + sqrt(gauvar/density)*randn(s0);
  4 comentarios
Mohammed Abdul Wadood
Mohammed Abdul Wadood el 26 de Jul. de 2022
Editada: Mohammed Abdul Wadood el 28 de Jul. de 2022
I tried it, thank you
Before asking my question here, I had already tried this method on the attached image
clc
clear all
close all
A = imread('Jupiter1.jpg');
figure
imshow(A)
A = im2double(A);
figure
imshow(A)
v = (0.75*std(A(:)))^2;
noisy_image = imnoise(A, 'gaussian', 0, v);
figure
imshow(noisy_image)
But I was confused, is this method correct or not?
DGM
DGM el 26 de Jul. de 2022
I'm not really sure how you're trying to do this. If you're working with integer images, you could indeed pick a variance that would result in an approximate fraction of pixels being unaffected without the need for masking:
inpict = imread('cameraman.tif');
v = 0.000038;
outpict = imnoise(inpict,'gaussian',0,v);
nnz(outpict~=inpict)/numel(inpict) % fraction of altered pixels
ans = 0.7510
imshow(outpict)
This only really works because the image is quantized. Noise is still applied to every pixel during the process; it's just that (in this example) ~25% of the time, the noise is smaller than 1 LSB, so those pixels don't change. If this is the desired method, then the amount of achievable noise will be very small, and will be dependent on the image class.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Image Processing Toolbox en Help Center y File Exchange.

Productos


Versión

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by