グレースケール化を行うフィルター機能を追加します。
グレスケール化する関数
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に変換する目的で使っています。
コメント