2013-07-29 2 views
2

Добрый день,проблемы с imshow() и rgb2gray() в MATLAB

при запуске следующий код:

testImage = double(imread(testfile)); 
figure; imshow(testImage) 
greyTestImage = rgb2gray(testImage); 
figure; imshow(greyTestImage) 

я нечетко и в основном пустые изображения, я не смог Fx его с помощью Colormap. Ниже Teh исходное изображение и получившиеся цифры:

1: original image

2: result of imshow

3: image after rgb2gray

+0

Что такое формат тестового файла? – CTZStef

ответ

5

Вы должны знать формат изображения, которое вы пытаетесь прочитать. Чтобы сделать это, конечно, я всегда использую следующий фрагмент кода в своих программах, когда я хочу, чтобы преобразовать определенные пользователем изображения из неизвестного формата в оттенках серого Uint8:

% load image 
    [filename, pathname] = uigetfile({'*.*'},'image file'); 
    fullFilename = [pathname filename]; 
    % Get image info, read it accordingly 
    info = imfinfo(fullFilename); 
    if(strcmp('truecolor',info.ColorType)) 
     I = imread(fullFilename); 
     Igray = uint8(rgb2gray(I)); 
     clear I 
    elseif(strcmp('grayscale',info.ColorType)) 
     Igray = uint8(imread(fullFilename)); 
    elseif(strcmp('indexed',info.ColorType)) 
     [I,map] = imread(fullFilename); 
     Igray = uint8(ind2gray(I,map)); 
     clear I map 
    else 
     error('statPart:FormatImage','Image format error'); 
    end 
    clear info 

Кроме того, это: testImage = double(imread(testfile)); не будет работать, если вы предполагаете testfile - uint8 и хочет преобразовать его в двойное (в двойной интенсивности - от 0 до 1). Вы должны сделать testImage = double(imread(testfile))/255;

Надеюсь, что эта помощь.

Приветствия

+0

Это. Альтернативно просто отпустите 'double()' и, в зависимости от исходного формата вашего изображения, он должен работать. – McMa

1

Это, вероятно, проблема с изображением загружаемой.

Вход в функцию rgb2gray должен быть трехканальным цветным изображением (матрица MxNx3 для каналов R, G, B).

Если вы используете встроенную в Matlab образец изображения, вы можете эффективно сделать:

imdata = imread('ngc6543a.jpg'); 

figure; imshow(imdata) 

enter image description here

Тогда:

test = rgb2gray(imdata); 

enter image description here

2

Вы пробовали преобразования в 8 разрядных целых чисел без знака?

testImage = double(imread('PEYXW.jpg')); 
figure; imshow(uint8(testImage)) 
greyTestImage = rgb2gray(uint8(testImage)); 
figure; imshow(greyTestImage) 

first image

second image

1

На самом деле, Matlab обеспечивает функцию Im2double вместо double для преобразования изображений в двойную Precison:

testImage = im2double(imread(testfile)); 
figure; imshow(testImage) 
greyTestImage = rgb2gray(testImage); 
figure; imshow(greyTestImage) 

В двойной точности, значение изображения RGB находится между 0 и 1, для uint8 они находятся в диапазоне от 0 до 127. Когда вы используете double, все значения RGB сохраняют свою ценность, но они имеют двойную точность. Это означает, что любой символ RBG со значениями> = 1 приведет к двойному> = 1 и, таким образом, приведет к пробелу в вашем изображении. im2double фактически масштабирует значения до диапазона [0 1].

+0

Диапазон изображения uint8 по определению равен [0 255], а не [0 127]. http://www.mathworks.com/help/matlab/creating_plots/working-with-8-bit-and-16-bit-images.html#f2-1737 – CTZStef

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