ノンローカルミーンフィルタ行うフィルター機能を追加します。
ソースコード
ファイル名:Form1.NLMean.cs(新規追加)
using OpenCvSharp;
using OpenCvSharp.Extensions;
namespace GazouKakou02;
public partial class Form1 : Form
{
// メニュー項目
readonly ToolStripMenuItem nlmeanMenuItem = new()
{
Text = "ノンローカルミーン",
};
/// <summary>
/// ノンローカルミーンの初期化
/// </summary>
public void Init_NLMean()
{
// メニューの登録
filterMenuItem.DropDownItems.Add(nlmeanMenuItem);
// フィルター(ノンローカルミーン)
Func<Bitmap, float, Task<Bitmap>> filter = new(async (src, h) =>
{
return await Task.Run(()=>
{
using Mat srcMat = BitmapConverter.ToMat(src);
using Mat dstMat = new();
if (srcMat.Channels() == 1)
{
// グレースケール
Cv2.FastNlMeansDenoising(srcMat, dstMat, h);
} else {
// カラー
Cv2.FastNlMeansDenoisingColored(srcMat, dstMat, h);
}
return BitmapConverter.ToBitmap(dstMat);
});
});
// メニューアイテムのクリックイベント
nlmeanMenuItem.Click += (s, e) =>
{
if (_buffBmp is null) return;
var dialog = new FilterDialog();
dialog.Load += (s, e) =>
{
dialog.Track1.Maximum = 20;
dialog.Track1.Minimum = 0;
dialog.Track1.Value = 7;
};
bool filterFlag = false;
dialog.OkBtn.Enabled = !filterFlag;
Bitmap? bmp = null;
dialog.Track1.ValueChanged += async (s, e) =>
{
dialog.Track1Label.Text = string.Format("h:{0}", dialog.Track1.Value);
if (filterFlag)
{
// フィルター実行中につきキャンセル
return;
}
filterFlag = true;
var backupValue = dialog.Track1.Value;
var currentValue = backupValue;
do
{
backupValue = currentValue;
float h = currentValue;
bmp = await filter(_buffBmp, h);
dialog.Picbox.Image?.Dispose();
dialog.Picbox.Image = bmp;
currentValue = dialog.Track1.Value;
} while( currentValue != backupValue);
filterFlag = false;
dialog.OkBtn.Enabled = !filterFlag;
};
if (dialog.ShowDialog() == DialogResult.OK)
{
// OK
this.Bmp = bmp;
} else {
// Cancel
bmp?.Dispose();
}
};
}
}
実行
画像が表示されている状態でメインメニュー「フィルター」→「ノンローカルミーンフィルタ」を選ぶ
ノンローカルミーンフィルタは比較的処理が重いので、トラックバーで値を調整後「実行」ボタンを押すことでフィルターが実行されるようにしました。
コメント