ColorMatrixで画像にフィルターをかける2017年10月01日(編集2017年10月06日)TweetAndroidアプリを作成するとき、ColorMatrixで画像にフィルター処理を施すことができます。この記事は、ColorMatrixを使って、画像にフィルター処理をする方法を記載した記事です。中級者向け(行列や画像処理の基本的な知識を含む)サンプルコードAndroid-Image-DemoColorMatrixColorMatrix(カラーマトリクス)は、RGB空間の座標を定義する行列です。Androidで用意されているColorMatrixクラスは、RGBAを扱う4×5の行列です。行列は、回転やスケーリングなどの線形変換のみをサポートします。行列を使用する必要があります。Androidのカラーマトリクスは非線形変換をサポートしません。非線形変換とは、積和演算で計算できないメディアンフィルターなどのことです。(この記事で理解する必要はありません)色の表現ビットマップの各ピクセルの色は、赤、緑、青、およびアルファの各成分に8ビットを使用する32ビットの数値で表します。rgba(0,0,255,1)rはRed(赤)、gはGreen(緑)、bはblue(青)、aはalpha(透明)を表しています。このrgbaの値は青色です。他のrgbaも確認してみましょう。rgba(255,0,0,1)は赤色、rgba(0,255,0,1)は緑色になります。rgba(0,0,255,1)の各4つの成分の値は、0〜255の範囲の数値を使います。赤、緑、青の場合、0は輝度なしを表し、255は最大輝度を表します。アルファ成分0は完全な透明で、255は不透明です。ColorMatrix仕様ColorMatrixの値は、画像の色成分の割合です。ColorMatrixの初期値は以下の通りです。初期値(カラーマトリクス初期値)例えば、画像の赤色を半分にする場合は以下のようなColorMatrixを生成します。赤の成分を半分にする上記のColorMatrixは、赤の成分を0.5倍するという意味になります。最後に、ColorMatrixの計算方法を説明します。A')を以下のように求めます。具体的な計算式は以下のようになります。単純な行列の内積の計算です。計算式を見ると、e,j,o,tの列は、加算用の成分として用意されているのがわかります。掛け算以外に、e,j,o,tの列で加算(あるいは減算)する成分を用意して、黒の色(0なので何をかけても0)の値をコントロールできるようにしているのがポイントです。次に、変換行列がRGBカラーをどう変えるのか、具体的な例で示します。対角成分が1であとの成分が0の行列は「単位行列」と呼ばれます。ColorMatrixの初期値はこの単位行列です。この単位行列をRGBカラーの列ベクトルに乗じても、変換したベクトル成分のRGBカラー値は、もとのままで変わりません。画像をグレースケールに変換する場合を考えます。単純なグレースケールをするには、Red(赤)、gはGreen(緑)、bはblue(青)の3つの成分の比率を等しくします。仮に1/3ずつとします。すると、以下の計算になります。全成分を1/3に変換したグレースケールは精度がよくないので、本来は違う値を利用しますが、考え方を理解することが大切です。実装ColorMatrix仕様で説明をした「画像の赤色を半分にする」カラーマトリクスを設定してみましょう。ColorMatrix生成ColorMatrixを生成します。ColorMatrix()ColorMatrixの初期化で生成される行列は以下のような単位行列になります。赤の成分を半分にします。1.0f);setScaleメソッドを使うと以下のような計算されたcolorMatrixが作成されます。ように、各成分の値がスケーリングされています。ColorMatrixColorFilter(colorMatrix)colorFilterにColorMatrixColorFilterを設定します。以上で実装は完了です。ビルド上記のコードの動作を確認してみましょう。変更前の画像Lenaです。フィルター適用前フィルターを適用します。赤の要素が減り、青っぽさが強調されています。成分に1/3をかけたグレイスケールも確認してみます。フィルターを適用します。フィルター適用後グレイスケール風のフィルターが適用されました。結論ColorMatrixを使うと画像にフィルター処理をおこなうことができます。計算速度も最適化されているので、ColorMatrixで適応可能な場合は、ColorMatrixでフィルターを使って実装しましょう。