アンシャープマスキングフィルタで先鋭化を行います。
ソースコード
ファイル名:Form1.Unsharp.cs(新規追加)
using OpenCvSharp;
using OpenCvSharp.Extensions;
namespace GazouKakou02;
public partial class Form1 : Form
{
// メニュー項目
readonly ToolStripMenuItem unshapMenuItem = new()
{
Text = "アンシャープマスキング",
};
/// <summary>
/// アンシャープマスキングフィルタの初期化
/// </summary>
public void Init_Unsharp()
{
// メニューの登録
filterMenuItem.DropDownItems.Add(unshapMenuItem);
// フィルター(アンシャープマスキングフィルタ)
Func<Bitmap, double, Task<Bitmap>> filter = new(async (src, k) =>
{
return await Task.Run(()=>
{
using Mat srcMat = BitmapConverter.ToMat(src);
using Mat dstMat = new();
double[,] kernel = {{-k/9.0, -k/9.0, -k/9.0,},{-k/9.0, 1.0 + (8.0 * k)/9.0, -k/9.0,},{-k/9.0, -k/9.0, -k/9.0,},};
Cv2.Filter2D(srcMat, dstMat, -1, InputArray.Create(kernel));
return BitmapConverter.ToBitmap(dstMat);
});
});
// メニューアイテムのクリックイベント
unshapMenuItem.Click += (s, e) =>
{
if (_buffBmp is null) return;
var dialog = new FilterDialog();
dialog.Load += (s, e) =>
{
dialog.Track1.Maximum = 200;
dialog.Track1.Minimum = 1;
dialog.Track1.Value = 10;
};
bool filterFlag = false;
dialog.OkBtn.Enabled = !filterFlag;
Bitmap? bmp = null;
dialog.Track1.ValueChanged += async (s, e) =>
{
dialog.Track1Label.Text = string.Format("k:{0}", (double)dialog.Track1.Value / 10.0d);
if (filterFlag)
{
// フィルター実行中につきキャンセル
return;
}
filterFlag = true;
var backupValue = dialog.Track1.Value;
var currentValue = backupValue;
do
{
backupValue = currentValue;
double k = (double)currentValue / 10.0d;
bmp = await filter(_buffBmp, k);
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();
}
};
}
}
コメント