Archive for the ‘未分類’ Category

C言語による画像処理入門 その1

水曜日, 5月 30th, 2012
このエントリーを含むはてなブックマークはてなブックマーク - C言語による画像処理入門 その1


C言語をひと通り学ぶと、多くの人は画像処理だったりゲーム作りだったりと、目に見えるものを作りたくなるものです。しかし、画面上にHello, Worldを表示するのと、ウインドウを出すのとでは天と地ほどの開きがあるのです。Windowsでは、Windows特有の言語を使って100行近いコードを書かないと、ウインドウすら出てくれません。これでは、画像処理の勉強をしているのかWindowsプログラミングの勉強をしているのか分からなくなってしまいそうです。

たまに、C言語のみで画像処理を行なっている入門者用のサイトがあったとしても、やれSDKをインストールしろだとか、やれ自作ライブラリをリンクしろだとか、入門者には意味プーのことばっかり書いてあって心が折れてしまいそうです。また、世の中にはOpenCVというIntelが開発した天才的に楽ちんなライブラリがあるのですが、ほぼ完全にブラックボックス化されており、画像処理の低レベルな部分を勉強したい人には不向きです。(といっても実用ではモックを作るときなどには便利ですので結構利用しています)

 

この講座のコンセプト

そこで、この「C言語による画像処理入門」では、ライブラリ不要、Windowsプログラミング不要、ブラックボックスはなし、という条件のもとC言語のみで画像処理を行なって行きたいと思います。
 

これだけは持っておきたい参考書

さてさて、ここで少し参考書の話をしておきましょう。現在日本にはまともな画像処理の参考書が数冊しかありません。そこで先だって、その数冊のうち「これを知らなければモグリだろ」というくらい有名な参考書を1冊あげております。これから画像処理を頑張るか、という人は持っていて絶対に損はありませんよ!
 
 

ディジタル画像処理
ディジタル画像処理
posted with amazlet at 12.05.30
CGーARTS協会
売り上げランキング: 4299

 
 
この本では、2値化やエッジ抽出といった低レベルな画像処理から、Snakeや物体認識といった高レベルな画像処理まで画像処理の基本となる技術を幅広く網羅しており、まさに教科書的な参考書です。大学などで画像処理を勉強したいなら、この本に書いてあることはひと通りマスターしておいたほうが良いでしょう〜。画像処理をやる際には手元に欲しい一冊です。
 
 

ゲームプログラマになる前に覚えておきたい技術
平山 尚(株式会社セガ)
秀和システム
売り上げランキング: 10284

 
 
もう一冊のこの本は、タイトルからも分かる通りゲーム作りの本です。ゲーム作りの本なのですが、画像処理に大切なことが、本当にたくさーん詰まっています。たしかにキャッシュの話とか、浮動小数点演算の話とか入門者にはちょっとレベルが高い話もありますが、知っているか知らないかで後ほどボディーブローのように聞いてくる技術がもりだくさんです。画像処理という分野にかかわらず、幅広い分野でつかえる素晴らしい技術書です。何も言わずに買って下さい(笑)
 

まとめ

ということで、今回はこの「C言語による画像処理入門」のコンセプトと参考書の話で終わってしまいましたが、次回は、C言語で画像の読み込みをしてみたいと思います。

iTime goes by

金曜日, 10月 14th, 2011
このエントリーを含むはてなブックマークはてなブックマーク - iTime goes by

本日、iPhoneアプリ「iTime goes by」をリリースしました。「iTime goes by」は、撮影した画像に対して回転や上下左右、拡大縮小などのアクションをつけることができるため、写真の中の人やものを動かすことが出来ます!写真撮影で止まってしまった時間を、このアプリでもう一度動かしてみませんか?
 
 
下の写真は、このアプリケーションを使って作成した作品です。「iTime goes by」では様々なアクションを付加できるのであなたの想像力次第でとっても楽しい作品ができるかもしれません!!
 
「どうやって撮ろうかなぁ・・・」

 
「流れる雲のようにどこまでも〜」

 
「素敵に海岸線をドライブ」

 
「まじ、ねっむ〜」

 
 
 
[使い方]
次にこのアプリの使い方を紹介します(といってもそれほど難しくありませんが・・・)まずは左下のカメラのアイコンをタップして、写真を撮影するか、ライブラリから写真を読み込んでください。

 
  
写真がロードされたら動かしたい部分を指でなぞります。失敗した時は画面右上にあるアンドゥボタンで作業を取り消すことも出来ます。

 
 
動作方法や移動速度、移動の幅などを変えたい場合には、うごいている「もの」をタップして下さい。各種動作を変更できるエディット画面が出現するので、気に入った動き方をするまで色々と試してみてください!

 
 
 
[iTunes Storeでみてみる]
もし、気になられた方は、下のアイコンをクリックしてiTunes Storeで見てみてください!よろしくお願いします!
 

OpenCVでウェーブレット変換プログラム

火曜日, 12月 21st, 2010
このエントリーを含むはてなブックマークはてなブックマーク - OpenCVでウェーブレット変換プログラム

OpenCVには2次元ウェーブレット変換(wavelet transform)のメソッドが実装されていなかったので作ってみた。先日作成した画像修復プログラムのテンプレートマッチングが遅い〜ってぼやいてたところ、@fukushima1981様から、ウェーブレット変換して多重解像度でのマッチをすればいいのでは?とのコメントを頂いたのが始まりです。

ウェーブレット変換の意味などは、こちらの参考書に素晴らしく分かりやすい説明が書いてあるので、参考にしてみてください。うちの研究室でもゼミ資料として使用しています。

これなら分かる応用数学教室―最小二乗法からウェーブレットまで
金谷 健一
共立出版
売り上げランキング: 51079

すごく簡単に(しかも1次元ウェーブレットで。笑)説明すると下図のような感じ。フーリエ変換の場合、変換結果は周波数ごとのパワー値で出てきます。(フーリエ変換の簡単な説明)それに対して、ウェーブレット変換の場合には、各周波数ごとに、パワー値の時間変化が変換結果として得られる。

wavelet2

要するに、フーリエ変換で得られる結果は、横軸が周波数、縦軸がパワーのグラフなのに対して、ウェーブレット変換で得られる結果は、横軸が時間、縦軸がパワーのグラフが周波数ごとに得られる感じです。(要されていない気もしますが・・・笑)

[ウェーブレット変換アルゴリズム]

Haar基底を使ったウェーブレット変換プログラムのアルゴリズムを説明します。非常に単純なアルゴリズムですので、容易に理解できるかと思います。

step1
まずは、画像中の行ごとに処理を行っていきます。隣り合うピクセルの平均値を計算し、画像の左半分に配置します。同様に隣り合うピクセルの差分値を計算し、画像の右半分に配置します。これを画像の上から下へ、全ての行に対して行います。

wavelet3

step2
次に、step1で作成した画像に対して、次は列ごとに処理を行っていきます。同様に隣り合うピクセルの平均値と差分値を計算し、それぞれ画像の上半分と下半分に配置します。これを画像の左から右へ、全ての列に対して行います。

wavelet4

step3
ここまでの処理で、左上にはピクセルを1/2に間引いた縮小画像、右上にはx方向エッジ検出画像、左下にはy方向エッジ検出画像、右下にはxy方向のエッジ検出画像が結果として格納されています。階層的な多重解像度の画像を作る場合は左上の画像に対して、再帰的にstep1からstep2を実行します。

[ウェーブレット変換プログラム]
ウェーブレット変換プログラムの本体メソッドがこちら。プログラムでは行列計算を用いることで、step1とstep2を同時に処理しています。ドライバプログラムと合わせたプログラムは下に置いておくのでDLしてお使いください。

void waveletTransform(IplImage *src, IplImage *dst, int level)
{
	int w, h;	
	float a, b, c, d;
	int tx, ty, hx, hy;
	
	w = src->width;
	h = src->height;
	
	while( --level ){
		for(int x = 0; x < w; x+=2){	
			for(int y = 0; y < h; y+=2){	
				tx = x >> 1;
				ty = y >> 1;	
				hx = w >> 1;
				hy = h >> 1;
				a = PIXVALF(src, x, y);
				b = PIXVALF(src, x+1, y);
				c = PIXVALF(src, x, y+1);
				d = PIXVALF(src, x+1, y+1);		
				PIXVALF(dst, tx, ty)		= (a+b+c+d)/4.0;
				PIXVALF(dst, hx+tx, ty)		= (a-b+c-d)/2.0;
				PIXVALF(dst, tx, hy+ty)		= (a+b-c-d)/2.0;
				PIXVALF(dst, hx+tx, hy+ty)	= (a-b-c+d);
			}
		}
		cvCopy(dst, src, NULL);
		w >>= 1;
		h >>= 1;
	}
}

こちらが、OpenCVで3段階に解像度を変えてウェーブレットした実行結果です。各解像度において、高周波成分と低周波成分が分離されていく様子が分かるかと思います。

wavelet1

ドライバも含めたウェーブレット変換プログラムをこちらに置いておきます。参考にしてみてください。
wavelet.zip

ところで、ウェーブレット空間でマッチングするのって、ただ単に縮小画像でマッチングするのとどう違うんだろ・・・^^;;

由無し事

月曜日, 12月 13th, 2010
このエントリーを含むはてなブックマークはてなブックマーク - 由無し事

どうでもいいことを書いてみたくなったので書いてみる。

・A型B型?

僕はA型ですが、何故かB型と言われることが多い今日この頃です。 気ままに生きてるからでしょうかねぇ?

ザ・A型の教授からは「A型の風上にもおけない」と言われ、ザ・B型の教授からは「俺より酷いB型を見たことがない」と言われ、 友人からは、「お前はC型肝炎だ」と言われ、 そろそろ、「int型だ」というヤツが出てきそうな気がしないでもないw

・どこみる

女の人のどこを最初に見る?と質問されて考えた結果。 かばん、ですね、僕は。

とりあえず、スポーツバッグ系は全滅ね、あれはフォルムが悪すぎる。円筒とか直方体とか、かばんに機能性をもとめちゃいかんですよw

次に、トートバッグ系の布製かばん。 あれもフォルム最悪。弁当かばんなら許す(笑)

あとは、ナイロン系バッグ。 エコバックですか?スーパーに行くんですか?

大学生がよく持ってるプラスチックの直方体バッグは、もはや、かばんじゃないですよね。

それ以外なら大丈夫、かな? フォルム、デザインともに好きなかばんがこちら。 20代限定だけどねw

・明日から

宮崎はシーガイアで開催されるHCG2010に参加してきます。何が楽しみって、飛行機に乗れること。 離陸して、空に上がる一瞬。 あの一瞬の爆発力こそが醍醐味。 地上の穢いしがらみから解放されて、 すべての選択肢を振りきって、 空の青と雲の白しかない世界への相転換。 あぁ、ほんとうに楽しみ!

と思ってたら、18:00離陸の便を予約してたよ、俺・・・orz

Quartzの背景を透明にする

金曜日, 12月 10th, 2010
このエントリーを含むはてなブックマークはてなブックマーク - Quartzの背景を透明にする

Quartzで描画するViewの背景を透明にする方法を説明します。QuartzViewを作成して、画像を描画する部分は、「Quartzを使って図形を描画する」と同様なので、こちらを参考にしてください。

下図は背景画像の上に背景が透明なQuartzViewを配置したものです。

quartzview

まずは、QuartzViewの背景を透明にする前に、前回の要領でQuartzViewを作成、配置します。

次に背景を透過するため、QuartzView.mを次のように記述します。

@implementation QuartzView

- (id)initWithCoder:(NSCoder*)coder
{
	if((self = [super initWithCoder:coder])) {
		self.backgroundColor = [UIColor clearColor];
	}
	return self;
}

- (void)drawRect:(CGRect)rect {
	[[UIColor clearColor] setFill];
	UIRectFill(rect);
	CGContextRef context = UIGraphicsGetCurrentContext();
	
	CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
	CGContextAddRect(context, CGRectMake(100, 180, 120, 120));
	CGContextDrawPath(context, kCGPathFillStroke);
}

@end

drawRect:メソッドの中で行っていることは、前回と同様Quartzを使用しての図形の描画です。前回との違いはinitWithCoder:メソッドの中で行っている下記の部分です。ここでは背景色を透明に設定しています。

self.backgroundColor = [UIColor clearColor];

ここに、今回のサンプルを置いておきます。
参考にしてください。
Quartz2.zip