画像の2値化とはある閾値をもとに 黒と白だけの2階調にすることです。画像の2値化処理も CvCppクラスではなく CvクラスのThresholdメソッドで行います。詳しくは ここを参照してください。
さてここまで進めて来て感じたことですが 当初あまりOpenCvSharpについて基礎知識がない段階で CvクラスのCvMatやIplImage で画像を扱うよりは OpenCv for Androidで少しは扱いなれた CvCppクラスのMatで画像を扱うほうが スンナリ入れるかなと思いCvCpp中心に実験を進めようとしました。しかし、進めて来ると画像処理で扱う多くのメソッドがCvクラス側に実装されていて CvCppクラス側には未実装のため画像処理の都度 MatとIplImageまたはCvMatへの変換が必要になりました。そこで今回から方針を変更し Cvクラス中心に実験を行うことにします。
画像の2値化は コンボボックスに 以下の文字列を格納し 各手法を選択する方法で実験しました。
“元画像”
“THRESH_BINARY”
“THRESH_BINARY_INV”
“THRESH_TRUNC”
“THRESH_TOZERO”
“THRESH_TOZERO_INV”,
“ADAPTIVE_THRESH_MEAN_C”
“ADAPTIVE_THRESH_GAUSSIAN_C”
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using OpenCvSharp;
namespace OpenCvShp
{
public partial class Form1 : Form
{
private IplImage src;
private IplImage dst;
private Boolean flag = false;
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
src = new IplImage(@"C:OpenCvTestDatayuri.jpg", LoadMode.GrayScale);
timer1.Enabled = false;
cmbMethod.SelectedIndex = 0;
}
private void cmbMethod_SelectedIndexChanged(object sender, EventArgs e)
{
switch (cmbMethod.SelectedIndex)
{
case 0: // 元画像
dst = src.Clone();
break;
case 1: // THRESH_BINARY
Cv.Threshold(src, dst, 0, 255, ThresholdType.Binary | ThresholdType.Otsu);
break;
case 2: // THRESH_BINARY_INV
Cv.Threshold(src, dst, 0, 255, ThresholdType.BinaryInv | ThresholdType.Otsu);
break;
case 3: // THRESH_TRUNC
Cv.Threshold(src, dst, 0, 255, ThresholdType.Truncate | ThresholdType.Otsu);
break;
case 4: // THRESH_TOZERO
Cv.Threshold(src, dst, 0, 255, ThresholdType.ToZero | ThresholdType.Otsu);
break;
case 5: // THRESH_TOZERO_INV
Cv.Threshold(src, dst, 0, 255, ThresholdType.ToZeroInv | ThresholdType.Otsu);
break;
case 6: // ADAPTIVE_THRESH_MEAN_C
Cv.AdaptiveThreshold(src, dst, 255, AdaptiveThresholdType.MeanC, ThresholdType.Binary,7);
break;
case 7: // ADAPTIVE_THRESH_GAUSSIAN_C
Cv.AdaptiveThreshold(src, dst, 255, AdaptiveThresholdType.GaussianC,ThresholdType.Binary,7,8);
break;
default:
return;
}
flag = true;
pictureBox1.Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (flag)
{
Bitmap bmp = new Bitmap(dst.Width, dst.Height);
bmp = dst.ToBitmap();
e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
bmp.Dispose();
}
}
}
}
元の画像 |
BINARY |
|
|
BINARY_INV |
TRUNC |
|
|
TOZERO |
TOZERO_INV |
|
|
ADAPTIVE_MEAN_C |
ADAPTIVE_GAUSSIAN_C |
|
|
Windows7 Vs2008 OpenCv2.4 And OpenCvSharp |