2016-12-05 3 views
0

У меня есть цвет, изображение rgb в Matlab (m, n, 3) [double]. Я выполняю линейный процесс диффузии по каждому каналу отдельно. Первый элемент в выходе LinearDiffusion представляет собой двойной массив (m, n, 1).Matlab. Невозможно объединить двойные массивы в изображение RGB.

[m,n,j]=size(noisy_image) 
rgb_im=zeros(m,n,3); 
for chn=1:3   
    noisy_chn=noisy_image(:,:,chn);  
    [rgb_im(:,:,chn), diff_un]=LinearDiffusion2016(noisy_chn, 0, dt, maxnl); 
end  

Я хотел бы отобразить rgb_im, который является (m, n, 3) [double]. Но независимо от того, что я делаю, всегда получаю пустой квадрат, хотя значения изображения не являются насыщенными. У меня нет проблем с изображениями в оттенках серого (uint8). Есть идеи?

ОБНОВЛЕНИЕ: Исходное изображение является (m, n, 3) [unit8], но я перехожу каждый канал в двойное, чтобы передать его LinearDiffusion.

спасибо.

+1

Получение пустого квадрата означает, что, когда вы участок его с помощью 'imshow' выглядит белым? Если ваше изображение удваивается, оно должно быть нормализовано до [0..1]. Попробуйте использовать 'imshow (yourimage, [])', и вы должны увидеть изображение правильно. –

+0

rgb_im был uint, на самом деле. Это был мой образ, который превратил его в двойное, чтобы прокормить его LinearDiffusion. Моя вина, извините. – javierjsa

ответ

3

Причина заключается в том, что MATLAB интерпретирует чисел с плавающей точкой в ​​изображениях в виде фракции от 0 до 1 (включительно), в то время как целые числа, интерпретируются как битовые значения между 0 и 255 (включительно). Вы преобразовали целые значения в двойные, выполнили свою математику, а затем сразу же перенаправили их обратно в imshow. MATLAB видит, что они удваивают и фиксируют все значения, превышающие 1 на 1, и поэтому все, что вы видите, является белым, если только у вас не было чисто черных пикселей. У вас есть два варианта: конвертировать обратно в целое число, как вы это делали в своем самообношении, или же разделить на 255 для изменения значений.

Было бы полезно, если бы эта информация была дана в файле imshow помощи, но вы должны докопаться до низкого уровня собственности CData изображений, чтобы получить эту информацию:

цветных изображений данных, указанную в одна из этих форм:

  • 3-D массив RGB троек - Этот формат определяет истинные данные цветного изображения с использованием значений RGB триплет. Каждый триплет RGB определяет цвет для одного пикселя изображения. Триплет RGB представляет собой трехэлементный вектор, определяющий интенсивность красных, зеленых и синих компонентов цвета. Первая страница трехмерного массива содержит красные компоненты, вторая страница содержит зеленые компоненты, а третья страница содержит синие компоненты. Поскольку изображение использует истинные цвета вместо цветов colormap, свойство CDataMapping не действует.

    • Если CDATA имеет тип двойной, тогда значение триплет RGB из [0 0 0] соответствует черному цвету, и [1 1 1] соответствует белым.

    • Если CData является целым типом, то изображение использует весь диапазон данных для определения цвета. Например, если CData имеет тип uint8, тогда [0 0 0] соответствует черному, а [255 255 255] соответствует белым. Если CData имеет тип int8, то [-128 -128 -128] соответствует черному, а [127 127 127] соответствует белым.

    • Если CData имеет логический тип, то [0 0 0] соответствует черному, а [1 1 1] соответствует белым.

1

При условии, что каждый канал изображения rgb должен быть uint8 (не двойным !!). Эта линия сделал трюк:

imshow(uint8(rgb_im)); 

Привет

 Смежные вопросы

  • Нет связанных вопросов^_^