C#のWinFormsで画像加工アプリ2「グレースケール化」

コンピュータ

グレースケール化を行うフィルター機能を追加します。

グレスケール化する関数

Cv2.CvtColor(srcMat, dstMat, ColorConversionCodes.BGR2GRAY);

srcMatが変換元で、
dstMatが変換先に、
ColorConversionCodes.BGR2GRAYオプションでRGBカラーをグレースケールへ変換を指定しています。
24bitカラーから8bitグレスケールへ変換されます。

誤っているかもしれませんが、アルファチャンネル付きのカラー(32bit)もこちらのオプションで実行できました。
また、srcMatとdstMatと異なるMatオブジェクトを指定していますが、srcMat,srcMatでsrcMatをグレイスケールへ変換することが出来ました。OpenCVSharpの関数は同様な引数を取る場合も多いですが、srcMatとdstMatが同じオブジェクトで通る場合と通らない場合があるので、基本的に異なるオブジェクトを指定する方が安全だと思います。

パッケージの追加

 cd GazouKakou01
dotnet add package OpenCVSharp4
dotnet add package OpenCVSharp4.Extensions
dotnet add package OpenCVSharp4.Windows

ソースコード

ファイル名:Form1.Grayscale.cs(新規追加)

using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace GazouKakou02;
public partial class Form1 : Form
{
    // メニュー項目
    readonly ToolStripMenuItem grayscaleMenuItem = new()
    {
        Text = "グレースケール",
    };
    
    /// <summary>
    /// グレースケールの初期化
    /// </summary>
    public void Init_Grayscale()
    {
        // メニューの登録
        filterMenuItem.DropDownItems.Add(grayscaleMenuItem);

        // フィルター(グレースケール)
        Func<Bitmap, Task<Bitmap>> filter = new(async (src) =>
        {
            return await Task.Run(()=>
            {
                using Mat srcMat = BitmapConverter.ToMat(src);
                using Mat dstMat = new();

                if (srcMat.Channels() == 1) return (Bitmap)src.Clone();

                Cv2.CvtColor(srcMat, dstMat, ColorConversionCodes.BGR2GRAY);

                return BitmapConverter.ToBitmap(dstMat);
            });
        });

        // メニューアイテムのクリックイベント
        grayscaleMenuItem.Click += async (s, e) =>
        {
            if (_buffBmp is null) return;

            var task = filter(_buffBmp);

            var dialog = new FilterDialog();
            dialog.Track1.Visible = false;
            dialog.Track1Label.Visible = false;

            var bmp = await task;
            dialog.Picbox.Image = bmp;

            if (dialog.ShowDialog() == DialogResult.OK)
            {
                // OK
                this.Bmp = bmp;
            } else {
                // Cancel
                bmp.Dispose();
            }
        };
    }
}

実行

画像が表示されている状態でメインメニュー「フィルター」→「グレースケール」

「OK」ボタンでフィルターが適用されます。

解説

カラーをグレスケールに変換する機能もありますが、個人的には24bit(RGB)や32bit(RGBA)を8bitに変換する目的で使っています。

コメント