imshow / imwrite изменяет все значения пикселей на 1

#matlab #octave #image-preprocessing #octave-gui

#matlab #октава #предварительная обработка изображения #октава-графический интерфейс

Вопрос:

У меня есть сохраненный набор данных Matlab .mat , который я пытаюсь обработать в графическом интерфейсе Octave. Данные состоят из изображений, и я хочу сохранить их в формате JPG (или любом другом формате изображения), но у меня возникает это странное поведение при попытке отображения или записи изображений. так часть изображения отображается в виде массива:

     91    90    91    88    93
    88    91    86    81    88
    93   100    90    85    91
    93   100    94    93    96
    87    87    87    87    89
 

Но когда я пишу изображение

imwrite(img, 'D:image_test_1.jpg')

и прочитайте это снова

img_read=imread('D:image_test_1.jpg')

В итоге я получаю это:

   1  1  1  1  1
  1  1  1  1  1
  1  1  1  1  1
  1  1  1  1  1
  1  1  1  1  1
 

Я попытался найти причину, но не смог найти окончательного ответа или разъяснения по этой проблеме. Даже когда я использую imshow для отображения изображения, я получаю пустое изображение.

Что случилось со всеми значениями пикселей?

Ответ №1:

Настройка в виде uint8 изображения

Чтобы указать, что это изображение использует 8-битный масштаб / формат, мы можем преобразовать массив в uint8() (8-битное целое число без знака). Этот формат предполагает диапазон значений интенсивности от 0 до 255 (типичный формат JPG). Я думаю, что причина, по которой массив отображается как 1, заключается в том, что Octave пытается проанализировать массив как двойной в диапазоне от 0 до 1. Поэтому результаты массива достигают предела 1, поскольку все значения интенсивности Image img массива / находятся вне диапазона (превышены). В качестве альтернативы мы можем преобразовать массив в double с помощью im2double() функции или увеличить исходный массив на 255.

Результат 8-битного изображения

 Image = [91  90  91  88  93; 
         88  91  86  81  88;
         93  100 90  85  91;
         93  100 94  93  96;
         87  87  87  87  89];

Image = uint8(Image);

imwrite(Image, 'D:image_test_1.jpg')
imshow(imread('D:image_test_1.jpg'),'InitialMagnification','fit');
 

Запускался с использованием MATLAB R2019b

Комментарии:

1. Это сработало! Большое спасибо за точный ответ!

2. Нет проблем, рад помочь.

3. еще один вопрос :). Я обнаружил, что могу указать качество изображения здесь octave.org/doc/v4.2.0/Loading-and-Saving-Images.html . но когда я устанавливаю значение качества, у меня возникает ошибка. У вас есть какие-либо идеи, почему? Спасибо

4. Это звучит как отдельный вопрос.

5. @salRad imwrite(Image, 'D:image_test_1.jpg','Quality',20) , похоже, работает для меня в MATLAB.