C#のWinFormsで画像加工アプリ7「バイラテラルフィルタ」

コンピュータ

バイラテラルフィルタ機能を追加します。

ソースコード

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

using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace GazouKakou02;
public partial class Form1 : Form
{
    // メニュー項目
    readonly ToolStripMenuItem bilateralMenuItem = new()
    {
        Text = "バイラテラルフィルタ",
    };
    
    /// <summary>
    /// バイラテラルフィルタの初期化
    /// </summary>
    public void Init_Bilateral()
    {
        // メニューの登録
        filterMenuItem.DropDownItems.Add(bilateralMenuItem);

        // フィルター(バイラテラルフィルタ)
        Func<Bitmap, int, double, double, Task<Bitmap>> filter = new(async (src, d, sigmaColor, sigmaSpace) =>
        {
            return await Task.Run(()=>
            {
                using Mat srcMat = BitmapConverter.ToMat(src);
                using Mat dstMat = new();

                Cv2.BilateralFilter(srcMat, dstMat, d, sigmaColor, sigmaSpace);

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

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

            var dialog = new FilterDialog();

            Label Track2Label = new()
            {
                Location = new(10, 380),
                Size = new(100, 40),
                Parent = dialog,
            };
            TrackBar Track2 = new()
            {
                Location = new (140, 380),
                Size = new (200, 40),
                Parent = dialog,
            };

            Label Track3Label = new()
            {
                Location = new(10, 440),
                Size = new(100, 40),
                Parent = dialog,
            };
            TrackBar Track3 = new()
            {
                Location = new (140, 440),
                Size = new (200, 40),
                Parent = dialog,
            };

            dialog.Load += (s, e) =>
            {
                Track3.Maximum = 256;
                Track3.Value = 20;
                Track3.Minimum = 1;
                Track2.Maximum = 256;
                Track2.Value = 50;
                Track2.Minimum = 1;
                dialog.Track1.Maximum = 256;
                dialog.Track1.Value = 15;
                dialog.Track1.Minimum = 1;
            };

            bool filterFlag = false;
            Bitmap? bmp = null;

            dialog.Track1.ValueChanged += async (s, e) =>
            {
                dialog.Track1Label.Text = string.Format("d:{0}", dialog.Track1.Value);
                if (filterFlag)
                {
                    // フィルター実行中につきキャンセル
                    return;
                }

                filterFlag = true;
                dialog.OkBtn.Enabled = !filterFlag;
                var backupValue1 = dialog.Track1.Value;
                var currentValue1 = backupValue1;
                do
                {
                    backupValue1 = currentValue1;

                    int d = currentValue1;
                    double sigmaColor = Track2.Value;
                    double sigmaSpace = Track3.Value;

                    bmp = await filter(_buffBmp, d, sigmaColor, sigmaSpace);
                    dialog.Picbox.Image?.Dispose();
                    dialog.Picbox.Image = bmp;

                    currentValue1 = dialog.Track1.Value;
                } while( currentValue1 != backupValue1 );

                filterFlag = false;
                dialog.OkBtn.Enabled = !filterFlag;
            };

            Track2.ValueChanged += (s, e) =>
            {
                Track2Label.Text = string.Format("Color:{0}", Track2.Value);
            };
            Track3.ValueChanged += (s, e) =>
            {
                Track3Label.Text = string.Format("Space:{0}", Track3.Value);
            };

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

実行

画像が表示されている状態でメインメニュー「フィルター」→「バイラテラルフィルタ」を選ぶ

dのトラックバーの変更でフィルターが実行されます。それ以外のトラックバーでは実行されません。

コメント