Оказывается, ваше изображение имеет ассоциированное цветовую карту с ним. Когда вы делаете X = imread('Lena.bmp');
, вы читаете с индексом. Это означает, что каждое значение представляет собой индекс в цветную карту - это не то же самое, что и сами фактические интенсивности.
Поэтому читайте на картинке с помощью цветовой карты, а затем преобразуйте проиндексированное изображение с цветовой картой в фактическое изображение. Вы должны были бы назвать два выхода вариант imread
, затем преобразовать индексированную изображение в соответствии с ind2rgb
:
[X,map] = imread('Lena.bmp');
im = ind2rgb(X,map);
imshow(im);
Я получаю это изображение, которое соответствует с правым изображением:
В будущем, если вы не уверены, имеет ли ваше изображение цветную карту с ней или нет, вызовите вариант с двумя выходами, а затем проверьте, не является ли второй вывод, содержащий цветовую карту, пустой. Если это так, то звоните 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);
После карты, как я меняю таблицу rgb в одну таблицу уровня серого? – ShineZero
@ShineZero Все оттенки серого, поэтому вы можете использовать 'im = rgb2gray (im);' или просто извлечь один канал: 'im = im (:,:, 1);'. В любом случае, все будет так. Я отредактировал свой ответ соответственно. Дайте мне знать, если это сработает! – rayryeng
Еще одна небольшая проблема, могу ли я изменить значение таблицы на 0 ~ 255? – ShineZero