Algoholic.in.ua

Решения > Конвертация из RGB в HSV и обратно

Конвертация из RGB в HSV и обратно С++

Категория: Решения | Добавлено: 2016-01-23 | Просмотров: 867

HSV (она же HSB) — цветовая модель, в которой цвет подается в виде следующих компонентов:


  1. Hue - цветовой тон, его значение варьируется в пределах [0-360].
  2. Saturation - насыщенность цвета. Значения компонента лежат в пределах от 0 до 1.
  3. Value (Brightness) - значение (яркость) цвета. Аналогично предыдущему случаю, значения лежат между 0 и 1.

Следующий пример кода реализует превращение цвета пикселя из модели RGB в HSV. Функция не возвращает ничего. Значения составляющих присваиваем аргументам функции. Для корректной работы алгоритма необходимо сначала перевести все значения RGB в тип double и разделить на 255. Таким образом мы получаем значения red, green и blue в диапазоне от 0 до 1. Далее используем формулы конвертации из RGB в HSV. В данной реализации hue также лежит в диапазоне от 0 до 1. Как разложить изображение на цветовые каналы, смотрите здесь


Код реализации на C++ (Visual Studio):

    	void rgbToHsv(Byte red, Byte green, Byte blue, double& hue, double& saturation, double& value) {
		double rd = (double)red / 255;
		double gd = (double)green / 255;
		double bd = (double)blue / 255;
		double max = fmax(rd, fmax(gd, bd)), min = fmin(rd, fmin(gd, bd));
		double h, s, v = max;
		double d = max - min;
		s = max == 0 ? 0 : d / max;

		if (max == min) {
			h = 0; 
		}
		else {
			if (max == rd) {
				h = (gd - bd) / d + (gd < bd ? 6 : 0);
			}
			else if (max == gd) {
				h = (bd - rd) / d + 2;
			}
			else if (max == bd) {
				h = (rd - gd) / d + 4;
			}
			h /= 6;
		}

		hue = h;
		saturation = s;
		value = v;
	    }
        

Далее рассмотрим обратное перевоплощение из цветовой модели HSV в RGB.


Код реализации на C++ (Visual Studio):

    	void hsvToRgb(double hue, double saturation, double value, Byte& red, Byte& green, Byte& blue) {
		double r, g, b;
		int i = int(hue * 6);
		double f = hue * 6 - i;
		double p = value * (1 - saturation);
		double q = value * (1 - f * saturation);
		double t = value * (1 - (1 - f) * saturation);
		switch (i % 6) {
			case 0: r = value, g = t, b = p; break;
			case 1: r = q, g = value, b = p; break;
			case 2: r = p, g = value, b = t; break;
			case 3: r = p, g = q, b = value; break;
			case 4: r = t, g = p, b = value; break;
			case 5: r = value, g = p, b = q; break;
		}
		red = r * 255;
		green = g * 255;
		blue = b * 255;
	    }
        

Пример:


Пример


Как Вы видите, после конвертации RGB в HSV и обратно, изображение визуально не изменилось.


Яндекс.Метрика
Украина онлайн