OpenCvSharpで大津の二値化で2値化してみました。
ソース
//
// 大津の二値化
//
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;
using OpenCvSharp.Extensions;
// コンパイル
// csc /t:winexe /r:OpenCvSharp.dll /r:OpenCvSharp.Extensions.dll ToThresholdOtsu.cs
class Form1 : Form {
// スプリットコンテナ
SplitContainer splitContainer = new SplitContainer {
Dock = DockStyle.Fill,
Orientation = Orientation.Horizontal, // 上下
Panel1MinSize = 100,
};
// ラジオボタン(フィルター)
RadioButton filterButton = new RadioButton {
Text = "大津の二値化",
Appearance = Appearance.Button,
AutoCheck = false,
Location = new System.Drawing.Point(10, 10),
Enabled = false,
};
// ピクチャボックス
PictureBox picbox = new PictureBox {
Dock = DockStyle.Fill,
AllowDrop = true,
SizeMode = PictureBoxSizeMode.Zoom,
};
// ビットマップ
Bitmap bmp;
// Mat
Mat mat;
// フィルター(グレースケール)
void filter() {
mat = BitmapConverter.ToMat(bmp);
Cv2.CvtColor(mat, mat, ColorConversionCodes.BGRA2GRAY);
Cv2.Threshold(mat, mat, 0, 255, ThresholdTypes.Otsu);
picbox.Image = BitmapConverter.ToBitmap(mat);
}
// panel2上のコントロールのEnableをセット
void setEnabled(bool flag) {
filterButton.Enabled = flag;
}
// フィルタースイッチ
void filterSwitch() {
setEnabled(false);
filterButton.Checked = !filterButton.Checked;
if (!filterButton.Checked) {
// フィルターOFF
picbox.Image = (Bitmap)bmp.Clone();
filterButton.Enabled = true;
return;
}
// フィルターON
filter();
setEnabled(true);
}
// コンストラクタ
Form1() {
// イベント
picbox.DragEnter += (o, e) => {
if(!e.Data.GetDataPresent(DataFormats.FileDrop)) return;
e.Effect = DragDropEffects.Copy;
};
picbox.DragDrop += (sender, e) => {
// ファイルドロップ
if(!e.Data.GetDataPresent(DataFormats.FileDrop)) return;
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files.Length < 1) return;
// 読み込み
bmp = new Bitmap(files[0]);
mat = null;
picbox.Image = (Bitmap)bmp.Clone();
filterButton.Checked = false;
setEnabled(true);
};
filterButton.Click += (o, e) => filterSwitch();
// コントロールの登録
splitContainer.Panel1.Controls.Add(picbox);
splitContainer.Panel2.Controls.Add(filterButton);
Controls.Add(splitContainer);
Size = new System.Drawing.Size(800,600);
}
// エントリーポイント
[STAThread]
static void Main() {
Application.Run(new Form1());
}
}
コメント