#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? Если это так, я подробнее рассмотрю этот формат.