2008年5月18日日曜日

[.NET]画像処理グレースケール化(3)

[.NET]画像処理グレースケール化(1)(2)では、画像を1pixelずつ操作し、その平均値をセットしなおすという方法をとってきましたが、今度は、.NET Frameworkに存在するColorMatrixというクラスを使用してグレースケール化します。

コード例はこんな感じ。

//RGBATのそれぞれの値をどのように変化させるかを配列に保持(RGB値を1/3にする)
float[][] gm = new float[][]{
    new float[]{1/3f,1/3f,1/3f,0.0f,0.0f},  // R 
    new float[]{1/3f,1/3f,1/3f,0.0f,0.0f},  // G
    new float[]{1/3f,1/3f,1/3f,0.0f,0.0f},  // B
    new float[]{0.0f,0.0f,0.0f,1.0f,0.0f},  // A
    new float[]{0.0f,0.0f,0.0f,0.0f,1.0f}}; // Three Translations

Bitmap bmp = new Bitmap(ctlPicture.Image);
ColorMatrix gcm = new ColorMatrix(gm);
using (ImageAttributes gia = new ImageAttributes())
using (Graphics g = Graphics.FromImage(bmp))
{
    gia.SetColorMatrix(gcmColorMatrixFlag.DefaultColorAdjustType.Bitmap);
    g.DrawImage(bmpnew Rectangle(00bmp.Widthbmp.Height), 00bmp.Widthbmp.HeightGraphicsUnit.Pixelgia);
    ctlPicture.Image = bmp;
}


この方式は、RGBAいずれかの要素のみを変換するということにいては汎用的であり、意外とよい方法といえそうです。

ちなみにこの方式では、約50ms程度で処理が終わります。一番遅い方式と比べると約14倍のパフォーマンスが出ています。
また、この3つの方式で生成される画像をファイルにbitmap形式で保存しても、同じデータにはなりませんでした。結果から、この方式は四捨五入していることがわかりました。ということで条件を合わせるために、他の方式も四捨五入しています。

1 件のコメント:

david santos さんのコメント...
このコメントはブログの管理者によって削除されました。