OpenCvには画像を平滑化する つまり 画像をぼかす方法には 色々な手法が準備されています。
Android版では フィルタの違いにより GaussianBlur medianBlur bilateralFilter blurおよびboxFilterとそれぞれ別のメソッドがあります。OpenCvオリジナルでも同様に個別のメソッドだ準備されています。
しかし OpenCvSharpでは CvクラスのSmoothメソッドにまとまっていて メソッドを実行する際の引数で各フィルタを切り替えます。実は最初このことに気づかず インテリセンスを頼りに進めていて GaussianBlur とか medianBlur が見当たらないことからまさか平滑化できないのではと 思ってしまいました。Webをググり ここでSmoothというメソッドを見つけホッとしました。
それによるとメソッドの引数は
Smooth(CvArr src, CvArr dst, SmoothType smoothtype,
int param1, int param2, double param3, double param4) とあり
SmoothType smoothtypeが追加されていることを除き
Android版のstatic void GaussianBlur(Mat src, Mat dst, Size ksize, double sigma1, double sigma2)
などと同様な引数になっています。int param1, int param2, double param3, double param4の扱いは 省略した場合の扱いも含め Android版のSize ksize, double sigma1, double sigma2と同じようです。
実験はGaussian Median Bilateral Blur BlurNoScaleの5つのボタンを準備し それぞれ対応する SmoothType メソッドを実行しました。簡単のため param1, param2, param3, param4 はほぼ同じ値にしてあります。
コーディング |
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 flg = false; public Form1() { InitializeComponent(); } //初期処理(画像データ読み込み・表示) private void timer1_Tick(object sender, EventArgs e) { timer1.Enabled = false; src = new IplImage(@"C:¥¥OpenCvTest¥¥Data¥¥Koala.jpg", LoadMode.Color); flg = true; dst = src.Clone(); pictureBox1.Invalidate(); } private void btnGaussian_Click(object sender, EventArgs e) { Cv.Smooth(src, dst, SmoothType.Gaussian, 19, 19, 7, 7); pictureBox1.Invalidate(); } private void btnMedian_Click(object sender, EventArgs e) { Cv.Smooth(src, dst, SmoothType.Median, 19, 19); pictureBox1.Invalidate(); } private void btnBilateral_Click(object sender, EventArgs e) { Cv.Smooth(src, dst, SmoothType.Bilateral, 19, 7, 7); pictureBox1.Invalidate(); } private void btnBlur_Click(object sender, EventArgs e) { Cv.Smooth(src, dst, SmoothType.Blur, 19, 19); pictureBox1.Invalidate(); } private void btnBlurNoScale_Click(object sender, EventArgs e) { Cv.Smooth(src, dst, SmoothType.BlurNoScale); pictureBox1.Invalidate(); } //描画処理 private void pictureBox1_Paint(object sender, PaintEventArgs e) { if (flg) { Bitmap bmp = new Bitmap(dst.Width, dst.Height); bmp = dst.ToBitmap(); e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height); bmp.Dispose(); } } } }
処理結果 |
元画像
Gaussianぼかし結果
Medianぼかし結果
Bilateralぼかし結果 これってほんとにぼけてる???
Android版と同じくあまりぼけているようには思えない
Blurぼかし結果
BlurNoScale結果 なんと!!!
なるほど これはBoxFilterの正規化なしに対応するもののようです。
Windows7 Vs2008 OpenCv2.4 And OpenCvSharp |