С документация imnoise
:
Если I
имеет двойную точность, то значения входных пикселей интерпретируются как средние распределения Пуассона, увеличенные на 1e12
.Например, если входной пиксель имеет значение 5.5e-12
, то соответствующий выходной пиксель будет сгенерирован из распределения Пуассона со средним значением 5.5
, а затем уменьшен на 1e12
.
Это масштабирование не происходит, когда ввод uint8
:
im = ones(256, 256, 'uint8');
noisy = imnoise(im, 'poisson');
В случае двойной точности, есть две проблемы:
Масштабирование1e12
кажется чрезмерным.Это означает, что вывод берется из распределения Пуассона со средним значением 1e12
, а затем делится на 1e12
.Среднее значение будет 1
, а стандартное отклонение будет sqrt(1e-12)=1e-6
.То есть стандартное отклонение будет крошечным, а изменение интенсивности не будет заметным.Если вы используете format long
, MATLAB покажет вам эти значения:
>> format long
>> min(noisy(:))
ans =
0.999996115518000
>> max(noisy(:))
ans =
1
Этот последний результат (максимум 1) указывает, что MATLAB обрезает результаты в [0,1]диапазон, потому что ожидается, что изображения двойной точности будут в этом диапазоне.Таким образом, дистрибутив, возвращаемый вашим кодом, не Пуассон, а Пуассон, усеченный по его среднему значению.
Итак, для изображений с плавающей точкой сначала соответствующим образом масштабируйте их:
noisy = imnoise(im * 1e-12, 'poisson') * 1e12;
(или используйте другой фактор, если он вам больше подходит).