『画像ピラミッド』 とは OpenCv CookBookによれば 解像度の異なる同一画像の集合 だそうで 要するに 何かの処理をする場合 あらかじめいくつかの解像度の画像の集合を準備し ザクッとした当たりをつけたあとさらに精密な処理を行う目的で使うもののようです。
OpenCvには buildPyramidというメソッドがあって 画像のListが作成できますが OpenCvSharpにはないようです。PyrDown, PyrUpのみ実装されています。PyrDownは画像を半分に PyrUpは画像を2倍にします。それにしても Android版でも書きましたが やっぱりResizeメソッドとの違いはわかりません。
実験は半分にするボタンと 2倍にするボタンを作ってそれぞれ PyrDown/PyrUpメソッドを実行しています。それぞれ あらかじめ変換先画像の格納先を準備していることに注意してください。
コーディング |
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 img; public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { img = new IplImage(@"C:¥OpenCvTest¥Data¥fujisan.jpg", LoadMode.Color); timer1.Enabled = false; pictureBox1.Invalidate(); } private void btnHalf_Click(object sender, EventArgs e) // 半分にする { IplImage w = new IplImage(img.Width / 2, img.Height / 2, img.Depth, img.NChannels); Cv.PyrDown(img, w); img = w.Clone(); pictureBox1.Invalidate(); } private void btnTwotimes_Click(object sender, EventArgs e) // 2倍にする { IplImage w = new IplImage(img.Width * 2, img.Height * 2, img.Depth, img.NChannels); Cv.PyrUp(img, w); img = w.Clone(); pictureBox1.Invalidate(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { if (!timer1.Enabled) { Bitmap bmp = new Bitmap(img.Width, img.Height); bmp = img.ToBitmap(); e.Graphics.DrawImage(bmp, (pictureBox1.Width - bmp.Width) / 2, (pictureBox1.Height - bmp.Height) / 2,bmp.Width, bmp.Height); bmp.Dispose(); } } } }
処理結果 |
テストデータの大きさは300*225ピクセル また画像表示用のピクチャボックスの大きさは600*450ピクセルとしました。
元の画像 | 半分にボタンを 一回押した状態 |
ここで2倍にボタンを 2回つまり元画像を 2倍にした状態 |
倍・倍にして画面からはみ出しても 半分・半分と繰り返すと元の画面にもどってきます。ただし、小さくした画像を拡大すると 画像はボケます。
Windows7 Vs2008 OpenCv2.4 And OpenCvSharp |