【问题标题】:Color Manipulation颜色处理
【发布时间】:2013-02-22 16:14:45
【问题描述】:

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

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

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

我得到了将 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,

反余弦输出以度为单位。

【问题讨论】:

  • 如果可能的话,我会将原始图像作为 RGB 位图加载到内存中,在内存中创建另一个位图并按照说明复制/交换 RGB 值。然后保存和/或显示新图像。但我可能过于从字面上理解了你问题的前三行。 (我有一个功能可以将屏幕图像转换为可打印的图像,该图像可以交换黑/白(屏幕上的黑色 BG)以及其他几种颜色。)
  • 我猜您需要保留颜色的原始强度,否则从 RGB 转换为 HSI 没有多大意义。也许你应该在你的问题中澄清这一点。
  • 嗯...是的,我猜恒指转换是一个错误的提示。我尝试交换 RGB 的值。但它只是给了我一个黑白图像。我已经用完了用于交换 RGB 值并生成具有交换颜色而不是 BW 图像的彩色输出的函数。
  • @Steve Valliere(我有一个功能可以将屏幕图像转换为可打印的图像,可以交换黑/白(屏幕上的黑色 BG)以及其他几种颜色。) - 那是什么功能?

标签: c++ opencv


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以试试 hsv 颜色 rappresentation :

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

      您可以在“色调和色度”下找到如何变换

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

      【讨论】:

        【解决方案4】:

        您的措辞使我认为您应该进行基础计算,但是由于您提到 opencv 作为标签,我会说您可以将图像转换为 HSV(我相信与 HSI 相同) ) 一行使用opencv:

        cvCvtColor( src, hsvDestination, CV_BGR2HSV );
        

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

        【讨论】:

          【解决方案5】:

          以下是我编写的函数(以及一些描述一对夫妇的 cmets),它们用于将“浅色”(在白纸上很难看到)颜色映射到黑色。我为要打印的每种颜色调用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;
          }
          

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

          【讨论】:

            猜你喜欢
            • 2011-02-07
            • 2012-11-02
            • 1970-01-01
            • 2011-04-12
            • 1970-01-01
            • 1970-01-01
            • 2014-05-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多