Блок артефакт в конвертации RGB 2 HSV

Я хотел бы преобразовать изображение из пространства RGB в HSV в MATLAB и использовать оттенок.

Однако, когда я использую 'rgb2hsv' или некоторые другие коды, которые я нашел в интернете, компонент Hue имеет блочные артефакты. Пример исходного изображения и версии артефакта блока показаны ниже.

оригинал

вздор

оттенок

вздор

1 ответ

Решение

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

im = imread('https://stackru.com/images/767ef1d68e6685f637ddcfd9c0755f0ec96f44e4.jpg');
im2 = rgb2hsv(im);
imshow(im2(:,:,1));

Этот код создаст выходное изображение, которое нам показал OP.


Вы напрямую используете Hue и показываете результат. Следует отметить, что Hue не имеет той же интерпретации, что и интенсивность оттенков серого, в соответствии с цветовым пространством RGB.

Вероятно, вам следует обратиться к определению оттенка. Оттенок в основном относится к тому, как люди воспринимают цвет или доминирующий цвет, который интерпретируется зрительной системой человека. Это угол, который сделан вдоль круглого отверстия в конусе HSV. Цветовое пространство RGB может быть представлено как все его цвета, заключенные в куб. Это трехмерное пространство, где каждая ось обозначает количество каждого основного цвета (красного, зеленого, синего), которое вносит вклад в рассматриваемый цветовой пиксель. Преобразование пикселя в HSV, также известное как Hue-Saturation-Value, преобразует цветовое пространство RGB в конус. Конус может быть параметризован расстоянием от начала конуса и движением вверх (значение), расстоянием от центра конуса, движущегося наружу (насыщенность), и углом вокруг круглого отверстия конуса (оттенок).

Вот как выглядит конус HSV:

вздор

Источник: Википедия

Соотношение между углом Оттенка и доминирующим / воспринимаемым цветом показано ниже:

вздор

Источник: Википедия

Как видите, каждый угол обозначает доминирующий цвет. В MATLAB это масштабируется между [0,1], Таким образом, вы не визуализируете оттенок должным образом. Вы используете канал Hue для непосредственного отображения этого результата в виде изображения в градациях серого.

Однако, если вы выполните сканирование значений в этом изображении и умножите каждый результат на 360, а затем обратитесь к таблице цветов оттенка, которую я показал выше, это даст вам представление о том, какие доминирующие цвета в этих местах пикселей будут быть.


Мораль этой истории в том, что вы не можете просто использовать оттенок и визуализировать этот результат. Преобразование в HSV, безусловно, может быть использовано в качестве шага предварительной обработки, но вам следует проделать дополнительную обработку в этой области, прежде чем произойдет что-то плодотворное. Смотреть на это непосредственно как на изображение довольно бесполезно, как вы видели на своем выходном изображении. Что вы можете сделать, так это использовать цветовую карту, которая выводит связь между оттенком и цветом, как на карте поиска оттенков, которую я вам показал, и вы можете затем раскрасить свое изображение, но на самом деле оно используется только как инструмент наблюдения.


Изменить: 23 июля 2014 г.

В качестве бонуса мы можем отобразить оттенок в качестве исходного изображения в градациях серого, а затем применить к нему соответствующую цветовую карту, чтобы мы могли фактически визуализировать, как выглядит каждый доминирующий цвет в каждом местоположении. К счастью, есть встроенная цветовая карта HSV, которая в значительной степени совпадает с картой цветов, которую я показал выше. Все, что вам нужно сделать, это сделать colormap hsv сразу после показа канала Хюэ. Мы можем показать исходное изображение и это цветное изображение рядом, выполнив:

im = imread('https://stackru.com/images/767ef1d68e6685f637ddcfd9c0755f0ec96f44e4.jpg');
im2 = rgb2hsv(im);
subplot(1,2,1);
imshow(im); title('Original Image');
subplot(1,2,2);
imshow(im2(:,:,1)); title('Hue channel - Colour coded');
colormap hsv;

Вот как выглядит фигура:

Эта цифра может быть немного запутанной. Небо помечается голубым как доминирующий цвет. Хотя это сбивает с толку, это имеет смысл. В ясный день небо голубое, но причина, по которой небо выглядит серым на этой фотографии, возможно, связана с вкладом в насыщенность и ценность. Насыщенность относится к тому, насколько "чистый" цвет. Как пример, правда красный (RGB = [255,0,0]) означает, что насыщенность составляет 100%. Значение относится к интенсивности цвета. В основном это относится к темному или светлому цвету. Таким образом, насыщенность и значение, скорее всего, сыграют здесь роль, которая сделает цвет серым. Несколько кусочков цвета, которые мы видим на изображении, - это то, что мы ожидаем от того, как мы воспринимаем цвета. Например, красный вдоль стороны реактивного носителя воспринимается как красный, а зеленый шлем воспринимается как зеленый. Нижняя часть реактивного носителя (по-видимому) также считается красной. Я не могу вам этого объяснить, но насыщенность и значение способствуют микшированию, так что общий выходной цвет составляет примерно серый или около того.

Блокировка, которую вы видите на изображении, наиболее вероятна из-за квантования JPEG. JPEG прекрасно работает в том смысле, что мы не видим никаких разрывов в гладких областях изображения, но способ кодирования изображения заключается в том, что он реконструирует его таким образом... способом, который значительно уменьшит размер, необходимый для сохранения изображение, но позвольте ему быть визуально привлекательным, как если бы вы смотрели на изображение RAW.


Мораль этой истории в том, что вы, безусловно, можете использовать Hue как часть своей цепочки обработки, но это не вся картина. Возможно, вам придется использовать насыщенность или значение (или даже оба), чтобы помочь вам различать цвета.

Другие вопросы по тегам