Добавление пуассоновского шума не влияет на изображение - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь добавить пуассоновский шум к очень простому изображению в MATLAB.

im = ones(256, 256);
noisy = imnoise(im, 'poisson');

Прочитав этот ответ, я тоже попробовал это.

im = ones(256, 256);
noisy = imnoise(im2double(im), 'poisson');

безрезультатно.

Я тоже пробовал с im = zeros(256, 256), но это тоже ничего не дало.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

С документация imnoise:

Если I имеет двойную точность, то значения входных пикселей интерпретируются как средние распределения Пуассона, увеличенные на 1e12.Например, если входной пиксель имеет значение 5.5e-12, то соответствующий выходной пиксель будет сгенерирован из распределения Пуассона со средним значением 5.5, а затем уменьшен на 1e12.

Это масштабирование не происходит, когда ввод uint8:

im = ones(256, 256, 'uint8');
noisy = imnoise(im, 'poisson');

В случае двойной точности, есть две проблемы:

  1. Масштабирование1e12 кажется чрезмерным.Это означает, что вывод берется из распределения Пуассона со средним значением 1e12, а затем делится на 1e12.Среднее значение будет 1, а стандартное отклонение будет sqrt(1e-12)=1e-6.То есть стандартное отклонение будет крошечным, а изменение интенсивности не будет заметным.Если вы используете format long, MATLAB покажет вам эти значения:

    >> format long
    >> min(noisy(:))
    ans =
         0.999996115518000
    >> max(noisy(:))
    ans =
         1
    
  2. Этот последний результат (максимум 1) указывает, что MATLAB обрезает результаты в [0,1]диапазон, потому что ожидается, что изображения двойной точности будут в этом диапазоне.Таким образом, дистрибутив, возвращаемый вашим кодом, не Пуассон, а Пуассон, усеченный по его среднему значению.

Итак, для изображений с плавающей точкой сначала соответствующим образом масштабируйте их:

noisy = imnoise(im * 1e-12, 'poisson') * 1e12;

(или используйте другой фактор, если он вам больше подходит).

0 голосов
/ 11 июня 2018

Я попробовал это с изображением, которое я снял в интернете с здесь.

I = imread('stick.jpg');
imshow(I)
J = imnoise(I,'poisson');
imshow(J)

enter image description here enter image description here

Если я возьму ваши и изменит его на гауссовский, вы увидите разницу.

I = ones(256,256);
imshow(I)
J = imnoise(I,'gaussian');
imshow(J)

Я недостаточно читал об этом, но, по моему убеждению, изображение имеет однородную интенсивность повсюду.

enter image description here

...