2013-03-07 4 views
0

У меня есть эта задача для обмена цветами на изображении.Манипуляция цветом

Изменение красного до синего Изменение синего к зеленому и изменению зеленого на красный

Пользователь вводит изображение, а на выходе будет отображаться изображение ж/поменять местами цвета.

Мне дали подсказку для преобразования RGB в HSI. Но все же ... Я не понимаю, как это сделать. Какие шаги следует предпринять, чтобы сделать эту задачу возможной? Ниже приведена формула для преобразования RGB в HSI Спасибо. :)

Уравнения для преобразования значений RGB в значения HSI Предположим, что R, G и B являются красными, зелеными и синими значениями цвета. Интенсивность HSI задается уравнением

I = (R + G + B)/3. 

Пусть теперь М минимальное значение среди R, G и В. HSI значение насыщенности цвета задается уравнением

S = 1 - m/I if I > 0, or 
S = 0   if I = 0. 

К преобразовать общий оттенок цвета в, H, чтобы угол измерение, использовать следующие уравнения:

H = cos-1[ (R - ½G - ½B)/√R² + G² + B² - RG - RB - GB ]   if G ≥ B, or 
H = 360 - cos-1[ (R - ½G - ½B)/√R² + G² + B² - RG - RB - GB ] if B > G, 

где выход обратных косинусный в градусах.

+0

Если возможно, я бы загрузил исходное изображение в виде растрового изображения RGB в память, создаю другое растровое изображение в памяти и скопировал/заменил значения RGB, как описано. Затем сохраните и/или покажите новое изображение. Но я, вероятно, беру первые три строки вашего вопроса слишком буквально. (У меня есть функция, которая преобразует изображение на экран в печатаемое изображение, которое меняет черный/белый (черный BG на экране), а также пару других цветов.) –

+0

Я предполагаю, что вам необходимо сохранить оригинальные интенсивности цвета, потому что в противном случае не было бы смысла скрывать от RGB до HSI. Возможно, вы должны уточнить это в своем вопросе. – Michael

+0

Хмм ... да, я думаю, что преобразование HSI было ложным намеком. Я попытался переставить значения RGB. но это просто дало мне черно-белое изображение. У меня уже исчерпаны функции, используемые для обмена значениями RGB и получения цветного вывода с измененными цветами, а не с изображением BW. – Abby

ответ

2

Поскольку цвета находятся в градусах и по кругу, вы должны добавить 120 градусов к оттенку.

0

Добавить 1/3 максимального значения оттенка в канал H каждого пикселя. Если вы используете глубину 8U, добавьте 255/3, если вы используете 32F глубину, добавьте 0,333 (но вычесть 1, если оно переполняет мимо 1)

0

вы можете попробовать ВПГ цвет rappresentation:

http://en.wikipedia.org/wiki/HSL_and_HSV

вы можете найти в разделе «Оттенок и цветность», как превратить

есть максимальное G означает значение между 1 и 3 максимальное значение синего составляет от 3 до 5 и максимальное значение R находится между 5 и 6 или 0 и 1! в конце вы умножаетесь на 60, и вы получаете степень, как значение

0

То, как вы это сформулировали, заставляет меня думать, что вы должны выполнять базовые вычисления, но поскольку вы упоминали opencv как тег, буду говорить, что вы можете преобразовать изображение в HSV (такой же, как HSI я считаю) с одной линии с использованием OpenCV:

cvCvtColor(src, hsvDestination, CV_BGR2HSV); 

вы можете найти более подробную информацию здесь: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html

0

Вот функции, которые я написал (и некоторые комментарии, описывающие пару), которые используются для отображения «света» (трудно видеть на белом фоне) бумага) цвета до черного. Я вызываю CheckSwapWhite для каждого печатаемого цвета, но его можно вызвать для каждого пикселя. У меня нет формулы для создания чего-то в сером цвете, но я уверен, вы могли бы найти это при творческом поиске Google.

//---------------------------------------------------------------------------- 
/* 
    Colour Brightness Formula 

    The following is the formula suggested by the World Wide Web 
    Consortium (W3C) to determine the brightness of a colour. 

    ((Red value X 299) + (Green value X 587) + (Blue value X 114))/1000 

    The difference between the background brightness, and the 
    foreground brightness should be greater than 125. 
*/ 
//---------------------------------------------------------------------------- 

int ColorBrightness(COLORREF cr) 
{ 
    return ((GetRValue(cr) * 299) + 
      (GetGValue(cr) * 587) + 
      (GetBValue(cr) * 114))/1000; 
} 

//---------------------------------------------------------------------------- 
/* 
    Colour Difference Formula 

    The following is the formula suggested by the W3C to determine 
    the difference between two colours. 

    (maximum (Red value 1, Red value 2) - minimum (Red value 1, Red value 2)) 
    + (maximum (Green value 1, Green value 2) - minimum (Green value 1, Green value 2)) 
    + (maximum (Blue value 1, Blue value 2) - minimum (Blue value 1, Blue value 2)) 

    The difference between the background colour and the foreground 
    colour should be greater than 500. 
*/ 
//---------------------------------------------------------------------------- 

int ColorDifference(COLORREF c1, COLORREF c2) 
{ 
    return (max(GetRValue(c1), GetRValue(c2)) - min(GetRValue(c1), GetRValue(c2))) 
     + (max(GetGValue(c1), GetGValue(c2)) - min(GetGValue(c1), GetGValue(c2))) 
     + (max(GetBValue(c1), GetBValue(c2)) - min(GetBValue(c1), GetBValue(c2))); 
} 

//---------------------------------------------------------------------------- 

COLOREF CheckSwapWhite(COLORREF cr) 
{ 
    int  cdiff; 
    int  bdiff; 

    bdiff = 255 - ColorBrightness(cr); // 255 = ColorBrightness(WHITE) 
    cdiff = ColorDifference(cr, RGB(0xFF,0xFF,0xFF)); 

    if((cdiff < gnDiffColorThreshold) || // (500 by default) 
     (bdiff < gnDiffBrightThreshold)) // (125 by default) 
    { 
     return RGB(0x00,0x00,0x00); // black 
    } 
    return cr; 
} 

Две пороговые переменные являются настраиваемыми настройками с заданными значениями по умолчанию.