0

我有这个任务来交换图像中的颜色。

将红色更改为蓝色 将蓝色更改为绿色并将绿色更改为红色

用户将输入图像,输出将显示带有互换颜色的图像。

我得到了将 RGB 转换为 HSI 的提示。但仍然......我不知道该怎么做。我应该采取哪些步骤才能使这项任务成为可能?以下是将RGB转换为HSI的公式谢谢。:)

将 RGB 值转换为 HSI 值的方程式 假设 R、G 和 B 是一种颜色的红色、绿色和蓝色值。恒指强度由等式给出

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

现在让 m 为 R、G 和 B 中的最小值。颜色的 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,

其中反余弦输出以度为单位。

4

5 回答 5

2

由于颜色是度数和圆形,因此您应该在色调上添加 120 度。

于 2013-03-07T12:52:38.353 回答
0

你可以试试 hsv 颜色 rappresentation :

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

您可以在“色相和色度”下找到如何转换

最大 G 表示值介于 1 和 3 之间,最大蓝色值介于 3 和 5 之间,最大 R 值介于 5 和 6 或 0 和 1 之间!最后你乘以 60,你得到一个类似值的度数

于 2013-03-07T14:06:31.047 回答
0

将最大色调值的 1/3 添加到每个像素的 H 通道。如果使用 8U 深度,则加 255/3,如果使用 32F 深度,则加 0.333(但如果溢出超过 1,则减 1)

于 2013-03-07T12:58:16.863 回答
0

你措辞的方式让我觉得你应该做基础计算,但既然你提到了 opencv 作为标签,我会说你可以用一个将图像转换为 HSV(我相信与 HSI 相同)使用opencv的行:

cvCvtColor( src, hsvDestination, CV_BGR2HSV );

您可以在此处找到更多信息:http: //docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html

于 2013-03-07T14:56:12.603 回答
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;
}

这两个阈值变量是具有给定默认值的可配置设置。

于 2013-03-11T15:53:03.420 回答