C#のWinFormsで画像加工アプリ16「ダイアログ生成のサブルーチン化とヒストグラム平坦化」

コンピュータ

ヒストグラムの平坦化を行います。

ダイアログ生成のサブルーチン化

ソースコード

ファイル名:Form1.EqualizeHist.cs

using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace GazouKakou02;
public partial class Form1 : Form
{
    // メニュー項目
    readonly ToolStripMenuItem equalizeHistMenuItem = new()
    {
        Text = "ヒストグラム平坦化",
    };
    
    /// <summary>
    /// ヒストグラム平坦化の初期化
    /// </summary>
    public void Init_EqualizeHist()
    {
        // メニューの登録
        filterMenuItem.DropDownItems.Add(equalizeHistMenuItem);

        // フィルター(ヒストグラム平坦化)
        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)
                    Cv2.CvtColor(srcMat, srcMat, ColorConversionCodes.BGR2GRAY);
                Cv2.EqualizeHist(srcMat, dstMat);

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

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

            var dialog = new FilterDialog();

            dialog.Track1Label.Visible = false;
            dialog.Track1.Visible = false;

            Bitmap? bmp = null;
            dialog.Load += async (s, e) =>
            {
                bmp = await filter(_buffBmp);
                dialog.Picbox.Image?.Dispose();
                dialog.Picbox.Image = bmp;
            };

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

画像が表示されている状態でメインメニュー「フィルター」→「ヒストグラム平坦化」を選ぶ

コメント