2016-12-30 4 views
0

Я читаю изображение с помощью следующей команды:Преобразование изображения к типу двойной

lefty = imread('sintra2.JPG'); 

и imshow(); дает мне хорошую resault. но если я пытаюсь использовать:

lefty = double(imread('sintra2.JPG')); 

imshow() дает мне белое изображение. Я работаю с относительно большим изображением shared here. Есть ли связь?

Как мне преобразовать в двойное, если это вообще необходимо? Мне сказали, что лучше работать с двойным при работе над обработкой изображений и компьютерным зрением в MATLAB.

ответ

6

При чтении изображения, его тип был uint8 и, таким образом lefty содержали значения от 0 до 255 (2 = 256). Когда вы использовали double, он преобразовал класс от uint8 в double, но значения остались такими же, i.e 0-255.

Здесь необходимо указать im2double, который не только преобразует значения в двойную точность, но и пересказывает значения в диапазоне 0-1, разделив все записи ввода на максимально возможное значение типа входных данных. Таким образом, в вашем случае, поскольку тип входных данных uint8, максимальное возможное значение которого равно 255, поэтому все значения будут делятся на 255. Обратите внимание, что возможно, что максимальное значение в ваших данных изображения может не быть 255, но поскольку максимальное значение возможное значение uint8 составляет 255, поэтому все значения будут разделены 255.

так следующее, что вы ищете:

lefty = imread('sintra2.JPG'); 
imshow(lefty) 
figure 
imshow(im2double(lefty)) 
+1

Я бы подумал переписать это: * ", но также пересказывает значения между 0 и 1" *. У людей может быть неправильное представление о том, что если ваши данные изображения не охватывают весь динамический диапазон типа данных (например, имея минимум и максимум 32 и 128 для 'uint8'),' im2double' будет масштабировать это изображение, минимум равен 0, а максимум равен 1. Все 'im2double' - это то, что он определяет тип изображения и делит все записи на входе на максимально возможное значение типа ввода. Дополнительного масштабирования не выполняется, кроме разделения. Это только я, и мне нравится nitpick. – rayryeng

+1

@rayryeng Мне это казалось очевидным, но теперь, прочитав ваш комментарий и другой ответ, я согласен с тем, что вы сказали. Так отредактировал его в соответствии с вашей рекомендацией. Спасибо –

+1

Awesome. У меня есть надпись. – rayryeng

3

Проблема с типом данных, который требуется imshow. Если изображение имеет тип int, его диапазон должен быть между 0 и 255. Если он равен удвоенному - от 0,0 до 1,0. Попробуйте это:

lefty = imread('sintra2.JPG'); 
imshow(lefty) 

или:

lefty = imread('sintra2.JPG'); 
imshow(double(lefty)/double(max(lefty(:)))) 
+0

так в основном изображение хорошо и преобразуется в два раза и Единственная проблема - это представление 'imshow()'? – havakok

+1

Да, вы правы – desa

+0

@havakok Чтобы избежать подобных проблем в будущем, пусть 'imshow' масштабирует изображение для вас:' imshow (lefty, []); 'Второй аргумент указывает, что минимальная и максимальная карта интенсивности и делая '[]' он масштабирует ваши данные изображения таким образом, что наименьшая интенсивность равна 0, а наибольшая интенсивность равна 1 для изображения типа double. – rayryeng

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

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