グレーアルゴリズムRGBカラー

オリジナルます。http://www.cnblogs.com/carekee/articles/3629964.html

まず、基準 
  色がグレースケールにするためには、非常によく知られた心理学の公式があります。

                          グレー= R * 0.299 + G * 0.587 + B * 0.114

第二に、整数演算

  実際には、低速の浮動小数点を避けたい、整数演算が必要です。
  私たちが達成するために1000倍整数演算アルゴリズムそれらを拡張することができ、すべての3つの精度係数ではないこと注:

                          グレー=(R * 299 + G * 587 + B * 114 + 500)/ 1000

RGBが8ビットの精度は、現在一般に1000スケーリングされるので、上記の計算は、32ビットの整数演算です。除算の後ろに整数の除算であることに注意してください、そう丸めを達成するために500を追加する必要があります。
  アルゴリズムは、32ビットコンピューティングを必要とするので、この式の別の変形は非常に人気があるからです。

                          グレー=(R * 30 + G * 59 + B * 11 + 50)/ 100

  しかし、にもかかわらず式は、32ビットの整数演算であるが、80×86の整数乗算及び除算命令のシステムの特性に応じて、16ビット整数算術乗算及び除算命令することができます。そして今、初期の32の人気(AMD64が出ている)、式を使用することをお勧めします。

第三に、整数算術シフト

  上記の整数演算は非常に高速でしたが、一つのことは、まだスピードが制限され、その部門の最後です。分割よりもはるかに高速のシフト係数は2の整数乗にスケーリングすることができます。
  慣用16ビット精度を使用して、電源16から2は65536であるので、この因子が計算されます。

                          0.299 * 65536 = 19595.264≈19595
                          0.587 * 65536 +(0.264)= 38469.632 + 0.264 = 38469.896≈38469
                          0.114 * 65536 +(0.896)= 7471.104 + 0.896 = 7472

  多くの人々は私が使用方法は四捨五入されていない丸め、それを見ました。誤差が大きく、前のある演算誤差演算結果を有するべきで丸め、端部の丸め処理はです。

  書かれた式は次のとおりです。

                          グレー=(R * 19595 + G * 38469 + B * 7472)>> 16

  2-20精度係数:

                          グレー=(R * 1 + G * 2 + B * 1)>> 2
                          グレー=(R * 2 + G * 5 + B * 1)>> 3
                          グレー=(R * 4 + G * 10 + B * 2 )>> 4
                          グレー=(R * 9 + G * 19 + B * 4)>> 5
                          グレー=(R * 19 + G * 37 + B * 8)>> 6
                          グレイ=(R * 38 + G * 75 + B * 15)>> 7
                          グレー=(R * 76 + G * 150 + B * 30)>> 8
                          グレー=(R * 153 + G * 300 + B * 59)>> 9
                          グレー=(R * 306 + G * 601 + B * 117)>> 10
                          グレー=(R * 612 + G * 1202 + B * 234)>> 11
                          グレー=(R * 1224 + G * 2405 + B * 467)>> 12
                          グレー=(R * 2449 + G * 4809 + B * 934)>> 13
                          グレー=(R * 4898 + G * 9618 + B * 1868)>> 14
                          グレー=(R * 9797 + G * 19235 + B * 3736 )>> 15
                          グレー=(R * 19595 + G * 38469 + B * 7472)>> 16
                          グレー=(R * 39190 + G * 76939 + B * 14943)>> 17
                          グレー=(R * 78381 + G * 153878 + B * 29885)>> 18
                          グレー=(R * 156762 + G * 307757 + B * 59769)>> 19
                          グレー=(R * 313524 + G * 615514 + B * 119538)>> 20

  図3および図4、図7、図8、図10、図11、図13、図14、図19および図20:注意深く観察フォーム上、これらは、実際に同じ精度であり
  、それが最良の16ビット演算精度7、よりを使用して計算されます。前回のスケーリング係数100倍その精度と速度:

                          グレー=(R * 38 + G * 75 + B * 15)>> 7

  実際には、最も興味深いのは、二つの精度、最適化をシフトすることができるということです。

                          グレー=(R +(WORD)G << 1 + B)>> 2

========================

ほとんどのコンピュータでは、赤、緑、青に対応するRGB色空間を使用して、割り当ての組成比に3の各色成分によって。一般に、3つの色を格納する32、24、16、8、4、2、使用することができるが、現在8ビットで表される最大成分と、最大値は32ビットカラーのため、255で、8ビットがハイであります透明性の程度を示すために使用されます。より一般的には、図のカラーマップ16を参照。8ビットグレースケールが、一般以下、3つの色成分から成る固有の位置の階調が同じです。

白黒テレビ、カラーテレビの互換性の問題を解決するために、つまり、YUV空間、カラーテレビジョンシステムでは、典型的には、Yは輝度信号を表すYUV色空間と呼ばれるものを使用します。

人間の目は輝度信号に最も敏感であるため、画像は、カラー画像をグレースケールに変換された場合、輝度信号を変換することができる保存することだけが必要です。

RGBからYUVへの変換式Y空間は次のとおりです。

Y = 0.299R + 0.587G + 0.114B

Windowsでは、それは16以上を示し、以下の図面、わずかに異なる[図に続く16ビットのパレットであって、前記透明各セルは、4バイトであり、特定の選択したカラーパレットを使用して表現しました;および特定の画素値はインデックスに格納され、1、2、4、8です。16上に直接画素の色を使用して、図2に示します。

=================================================
その後、どのようにグレースケールカラーマップに変換するには?

グレースケールのパレットには、まず特定のカラーパレット値を決定するために存在する必要があります。私たちは、先に述べたように、3つのコンポーネントが同じグレースケールです。

8ビットの時間に換算すると、256のパレット色があり、0〜255のそれぞれは、正確に、3つのコンポーネントが等しいです。

4ビット時間に換算すると、カラーパレット16、および他の等間隔の色は、三個の成分が等しい、255値。

時間は2、4色パレット、255色が均等間隔に等しい三つの成分に変換されます。

2つのパレット色は、時間に換算すると、0と255は、黒と白表しています。

グレースケールカラーに変換され、実際の明るさのレベル値に対応した式に従って計算した場合、0から255までの輝度;により異なる輝度レベルと異なるビット、特定の値Yを次のように

       Y = Y /(1 <<(8-変換ビット))。


それぞれ格納されたY値に対応するビットの数に対応し、最後のものは、得られたY値は、異なる方法で格納され、注意します。

// ------------------------------------------------ ----------
// RGB565は、8つのグレースケールを回し
----------------------------- // -----------------------------
   TUint8 gm_red、gm_green、gm_blue;
   TInt16 * des_ptr;
   TInt16 *白金;
   白金=(TInt16 *) P8; // RGB565ストリーム

   用(ティントJ = 0であり、j <H、J ++)
   {
         ため(TINT I = W; I> 0; i--)
         {
           gm_red =((*(TInt16 *)PT)&0xF800)>> 8。
           gm_green =((*(TInt16 *)PT)&0x07E0)>> 3。   
           gm_blue =((*(TInt16 *)PT)&0x001F)<< 3。   
           P [0] =(TUint8)((gm_red * 77 + gm_green * 150 + gm_blue * 29 + 128)/ 256)。
           P ++;
           PT ++;
        }
   }
   P = QT。//灰度图指针

 

顔の質問

書き込み機能、画素階調に32ビットRGBカラー値、RGB階調ターン式:灰色= 0.03 *赤+ 0.59 *緑+ 0.11 *ブルー、最低左側のRGB画素フォーマット(最上位ビット、右ビット):00000000RRRRRRRRGGGGGGGGBBBBBBBB。

unsigned int型ToGrey(unsigned int型RGB)

} {ご記入ください

 

答え

unsigned int型ToGrey(unsigned int型RGB)
{
 unsigned int型青色=(RGB&0x000000FF)>> 0。
 unsigned int型緑色=(RGB&0x0000FF00)>> 8。
 unsigned int型赤=(RGB&0x00FF0000)>> 16。
 printf( "\ nred =%dの、緑色=%dの、青=%d個の\ n"、赤、緑、青)。
 リターン(赤* 38 +緑色* 75 +青色* 15)>> 7。
}

  別の式は、でアドビフォトショップで 
     はAdobe RGB(1998)[ガンマ= 2.20]  
     グレー=(R&LT ^ G ^ + 0.2973 * 2.2 2.2 * 0.6274 * 0.0753 + B ^ 2.2)^(1 / 2.2)

この方法は、わずかに遅い実行されますが、うまく動作します。

      平均値の方法があります 

      GRAY =(赤+青+緑)/ 3

    (GRAY、GRAY、GRAY)替代(RED、GREEN、BLUE)

 

おすすめ

転載: blog.csdn.net/qq_30263737/article/details/90711903