2015-11-02 2 views
2

У меня есть изображение в градациях серого.MATLAB imread bmp изображение не верное

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

левый один читается MATLAB, правый один оригинальна

enter image description here

The original bmp file can be downloaded here.

ответ

4

Оказывается, ваше изображение имеет ассоциированное цветовую карту с ним. Когда вы делаете X = imread('Lena.bmp');, вы читаете с индексом. Это означает, что каждое значение представляет собой индекс в цветную карту - это не то же самое, что и сами фактические интенсивности.

Поэтому читайте на картинке с помощью цветовой карты, а затем преобразуйте проиндексированное изображение с цветовой картой в фактическое изображение. Вы должны были бы назвать два выхода вариант imread, затем преобразовать индексированную изображение в соответствии с ind2rgb:

[X,map] = imread('Lena.bmp'); 
im = ind2rgb(X,map); 
imshow(im); 

Я получаю это изображение, которое соответствует с правым изображением:

enter image description here


В будущем, если вы не уверены, имеет ли ваше изображение цветную карту с ней или нет, вызовите вариант с двумя выходами, а затем проверьте, не является ли второй вывод, содержащий цветовую карту, пустой. Если это так, то звоните ind2rgb соответственно:

[im, map] = imread('...'); %// Place your input image location here 
if ~isempty(map) 
    im = ind2rgb(im,map); 
end 

Потому что ваше изображение в оттенках серого, если вы хотите, чтобы преобразовать это в одном канале, либо использовать rgb2gray, или извлечь любой канал из изображения. Grayscale работает так, что каждый канал в RGB-изображении точно такой же.

Поэтому:

im = rgb2gray(im); 
%// Or 
%im = im(:,:,1); 

Изображение также будет иметь тип double, так, чтобы преобразовать в uint8 (наиболее распространенный тип), просто сделать:

im = im2uint8(im); 
+0

После карты, как я меняю таблицу rgb в одну таблицу уровня серого? – ShineZero

+0

@ShineZero Все оттенки серого, поэтому вы можете использовать 'im = rgb2gray (im);' или просто извлечь один канал: 'im = im (:,:, 1);'. В любом случае, все будет так. Я отредактировал свой ответ соответственно. Дайте мне знать, если это сработает! – rayryeng

+0

Еще одна небольшая проблема, могу ли я изменить значение таблицы на 0 ~ 255? – ShineZero

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

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