C#のWinFormsで画像加工アプリ15「アンシャープマスキングフィルタ」

コンピュータ

アンシャープマスキングフィルタで先鋭化を行います。

ソースコード

ファイル名: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();
            }
        };
    }
}

画像が表示されている状態でメインメニュー「フィルター」→「アンシャープマスキング」を選ぶ

コメント