0

画像の色を交換するというこのタスクがあります。

赤を青に変えて 青を緑に変えて 緑を赤に変えて

ユーザーが画像を入力すると、出力には色が入れ替わった画像が表示されます。

RGBをHSIに変換するヒントをもらいました。しかし、それでも... どうすればいいのかわかりません。このタスクを可能にするには、どのような手順を実行する必要がありますか? 以下は、RGB を HSI Thanks に変換するための式です。:)

RGB 値を HSI 値に変換する式 R、G、および B が、色の赤、緑、および青の値であるとします。HSI 強度は次の式で与えられます。

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

これは、「明るい」(白い紙では見にくい) 色を黒にマッピングするために使用する、私が書いた関数 (およびいくつかのコメントを説明したもの) です。印刷する各色を呼び出します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;
}

2 つのしきい値変数は、指定されたデフォルトで構成可能な設定です。

于 2013-03-11T15:53:03.420 に答える
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

hsv color 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 に答える