ピクセルのRGB値を単一のモノクロ値に変換するにはどうすればよいですか?
7 に答える
ColorFAQで1つの可能な解決策を見つけました。輝度成分Y(CIE XYZシステムから)は、1つのチャネルの色として人間が最も知覚するものをキャプチャします。したがって、これらの係数を使用します。
mono = (0.2125 * color.r) + (0.7154 * color.g) + (0.0721 * color.b);
この最近の科学論文では、カラー写真をグレースケールに変換する際の最先端技術を比較しています。これには、単純な輝度式やより複雑な手法が含まれます。
このMSDNの記事では(0.299 * color.R + 0.587 * color.G + 0.114 * color.B);
This Wikipedia article uses (0.3* color.R + 0.59 * color.G + 0.11 * color.B);
これは、あなたの動機が何であるかによって異なります。任意の画像をグレースケールに変換して見栄えを良くしたいだけの場合は、この質問に対する他の回答の変換で十分です。
カラー写真を白黒に変換する場合、プロセスは非常に複雑で主観的なものになる可能性があり、各画像に特定の微調整が必要になります。何が関係している可能性があるかについては、Adobe for Photoshop のこのチュートリアルをご覧ください。
これをコードで複製することはかなり複雑であり、結果の画像を美的に「完璧」にするには、ユーザーの介入が必要になります (それが何を意味するにせよ!)。
また、前述のように、RGB トリプレットからのグレースケール変換 (モノクロ画像がグレースケールである必要はないことに注意してください) は好みによって異なります。
たとえば、赤と緑のコンポーネントを捨てて、代わりに青の値をコピーするだけで、ごまかして青のコンポーネントだけを抽出できます。別の単純で一般的に問題のない解決策は、ピクセルの RGB トリプレットの平均を取り、その値を 3 つのコンポーネントすべてで使用することです。
Photoshop だけでも、プロフェッショナルで決して安価ではないグレースケール/モノクロ変換プラグインの市場がかなりあるという事実は、変換が単純でも複雑でも好きなようにできることを示しています。
RGB ベースの画像をモノクロに変換する背後にあるロジックは、単純な線形変換ではありません。私の意見では、このような問題は「カラー セグメンテーション」手法で対処する方が適切です。k-means クラスタリングによって「カラー セグメンテーション」を実現できます。
MathWorks サイトの参照例を参照してください。
カラーの原画。
k-means クラスタリングを使用してモノクロに変換した後
これはどのように作動しますか?
画像全体からすべてのピクセル値を収集します。幅 W ピクセル、高さ H ピクセルの画像からは、W *H のカラー値が得られます。ここで、k-means アルゴリズムを使用して 2 つのクラスター (またはビン) を作成し、色を適切な「ビン」に投入します。2 つのクラスターは、黒と白の色合いを表します。
k-means を使用した画像セグメンテーションを示す Youtube ビデオ? https://www.youtube.com/watch?v=yR7k19YBqiw
この方法の課題
k-means クラスタリング アルゴリズムは外れ値の影響を受けやすくなっています。RGB 距離が群集の残りの部分から遠く離れている色のランダムなピクセルがいくつかあると、重心が簡単にゆがみ、予期しない結果が生じる可能性があります。