Matlab rgb2hsv изменяет изображение

#image #matlab #rgb #hsv

#изображение #matlab #rgb #hsv

Вопрос:

Я пытаюсь преобразовать массив значений RGB в массив значений HSV в Matlab. Я запускаю следующий код:

 pic = imread('ColoradoMountains.jpg');

pic = rgb2hsv(pic);

imwrite(pic,'pic.jpg')
 

Но изображение, которое записывается, имеет совершенно разные цвета. Я пытался установить цветовую карту на hsv, но я не уверен, имеет ли это вообще смысл. Ничто в Интернете не соответствует моим ключевым словам, может кто-нибудь указать мне правильное направление?

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

1. jpeg не поддерживает hsv или rgb, jpeg всегда является YCbCr

Ответ №1:

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

 imwrite(pic,colormap('HSV'),'pic.png');
 

Вот документация для imwrite: http://www.mathworks.com/help/matlab/ref/imwrite.html

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

1. Работает ли это? Согласно документации, я ожидал pic бы, что это будет изображение с индексом HSV n m * 1, а не собственное изображение hsv n m * 3. Мне не удалось написать это правильно.

2. Это приводит к тому, что я получаю сообщение «ошибка: feval: функция ‘HSV’ не найдена». Может быть, проще просто написать ответ в rgb?

3. @Daniel, верно, я инстинктивно записал его в файл в формате png. В ближайшее время я рассмотрю, как это сделать с jpg.

4. @user3761002, это как-то странно… тот факт, что он вызывает feval, означает, что он интерпретирует «ВПГ» как функцию, которую он не должен делать. Вы уверены, что набрали его так, как я это сделал в своем ответе?

5. С этим ответом связано несколько проблем. 1) Это colormap (hsv), а не colormap (‘hsv’), по крайней мере, если я взгляну на документацию. 2) цветовые карты предназначены для индексированных изображений (см. Мой Ответ), rgb2hsv не выводит индексированное изображение.

Ответ №2:

В Matlab вы должны различать индексированное изображение и 3-канальное изображение. Индексированное изображение представляет собой изображение размером n * m * 1, где каждое значение диапазона [0,1] связано с цветом. Эта ассоциация называется цветовой картой, которая может быть, например, единичным кругом в HSV или RGB. Это можно записать imwrite с помощью параметра map, но это не то, что вы хотите.

Очевидно, что вам нужно изображение в кодировке HSV, что означает, что три rgb-канала преобразуются в три канала hsv. Это (насколько я знаю) невозможно. Если вы заглянете в документацию imwrite , вы увидите, как записываются изображения в формате CMYK, это делается неявной передачей изображения n * m * 4. Существует ли какой-либо из стандартных форматов файлов, который поддерживает HSV? Если это так, я подробнее рассмотрю этот формат.