2011年4月26日火曜日

【OpenCV】画像の二値化。CV_THRESHOLD_○×△

Thresholdってよく聞くけど何なのさ、と前も書いたようなデジャブに襲われましたが、【閾値】だそうですね。なかなかおぼえられん。OpenCVで画像の二値化を行ったときにちょっと気になったことがあったのでメモ。
画像の二値化は以下の方法にて。


doble cvThreshold( const CvArr* src, CvArr* dist, double threshold,
double max_value, int hreshold_type);

というメソッドを使う場面がありまして、このときthreshold typeの部分にいくつかデフォルトで定数が用意されているようなので、その内容が気になったので結果を表示してみました。invって何だって思ってたんですけど昨日書いたINVERTつまり逆って事なんですねー。

CV_THRESH_BINARY



CV_THRESH_BINARY_INV



CV_THRESH_TRUNC



CV_THRESH_TOZERO



CV_THRESH_TOZRO_INV





2011年4月24日日曜日

【sudy】2011.4.24
















OpenCVによる透視変換の実行結果。
cvGetPerspectiveTransform()
cvWarpPerspective()
を使っている。

これとは関係ないのだけれど、今日一番ハッとした内容は逆行列を使って連立方程式を解く方法。
x + y + z = 2
7x + 3y + z = 4
4x + 2y + z = 6

をそれぞれ
「1 1 1  「x  「2
 7 3 1   y = 4
 4 2 1 」 z」  6」

とおいて両辺に逆行列をかけると
行列
「x
 y
 z」
が求まると言うもの。うむ、確かに。
これはいろんな場面で使えそう。
ActionScriptのmatrixクラスにも逆行列を求めるメソッドinvert();があるみたいなのでFlashでなんか作るときもこれは使えそう。

2011年4月9日土曜日

【C】RGBをHSVに変換した時の表示について。



int main(int argc,char** argv)
{
cvNamedWindow("source",CV_WINDOW_AUTOSIZE);
cvNamedWindow("HSV");

IplImage* sourceImage = cvLoadImage(argv[1],
CV_LOAD_ANYDEPHT | CV_IMAGE_ANYCOLOR );
IplImage* hsvImage = cvCreateImage(cvGetSize(sourceImage),
IPL_DEPTH_8U,
3);
cvCvtColor(sourceImage,hsvImage,CV_BGR2HSV);

cvShowImage("source", sourceImage);
cvShowImage("HSV", hsvImage);

/*------略-------*/
}


RGBの画像のデータをHSVに変換して、そのデータがどんな感じになっているのかを上記のように表示しようとしたところ、画像が変な色で表示されてしまった。

こんな感じ。














で、少し調べてみたら、HSVに変換した情報自体が色空間情報をもっている訳ではないとの事。要するに画像を操作するようにデータを変換してあげていて、表示するための変換ではないと言う事らしい。というわけでcvShowImageで表示しようとしたときに、変な色で表示されてしまうと言う事らしい。たしかに、IplImage構造体のメンバ変数にもHSVとRGBを判別している値はない(とおもわれる?)し、cvShowImageの関数に引数を渡している訳でもないので、当然と言えば当然なのかもしれない。