• ベストアンサー

画像処理

opencvのプログラムを用いて唇の形状を検出いています。 前処理として平滑化と二値化を行い、ラプラシアンをかけているのですがノイズが多く検出が難しいです。 検出には動的輪郭モデル(SNAKES)を用いています。 上手く検出する方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

画像サイズ(解像度)に対して、唇が小さい場合はHaar-likeなどを用いてキャブレーションを行い(唇のおよその領域を検出して)からSnakeをかけてみてはどうでしょう? 口領域の抽出のHaar-likeは http://alereimondo.no-ip.org/OpenCV/34 にあります。(口をあけず、正面を向いている場合の精度は高いと思います) また、千葉大学の三宅研究室 http://www.mi.tj.chiba-u.jp/ で唇の検出をやっている学生がいらっしゃったので、一度コンタクトを取ってみることをお勧めします。

参考URL:
http://alereimondo.no-ip.org/OpenCV/34
syuncha
質問者

お礼

口領域も検出できるんですね。 Haar-likeを用いてがんばってみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • fonera
  • ベストアンサー率52% (38/72)
回答No.1

恐れ入ります。 私が学生の頃は、snakesと呼ばれる動的輪郭検出だと 1.最終的な形を与える(閉曲線の形) 2.大きなわっかを少しづつ変形させながら小さくしていく 3.ある程度、評価関数の値が一致したら、それで検出 という方法でした。 この方法だと、万能な唇の検出には向きません。(形が特定されるため) 他のマッチングが良いと思います。 個人的には、 ・平滑化と二値化の部分をうまくやらないとノイズが多くなると思います。 ・ラプラシアンをかけるなら、方向を考えるとうまくいくと思います。  (例えば、正面の顔であれば上下2方向のラプラシアンをかける) ある程度の精度で実用的な唇の検出を行いたいのでしたら、現在行われている前処理前に、やることがあると思います。 ・正面から写した写真を使い、顔を切り出す(アゴと頭頂は比較的容易に判定可能なので) ・写真の下側かつ真ん中あたりにあたりをつける ・周囲よりも赤い部分だけ、特徴付けする *** どのような用途を考えていらっしゃいますか? 画処理は外乱に非常に弱いです。その問題を解決するには、本当に画処理が必要ですか?そこの確認からかと思います。

syuncha
質問者

お礼

回答ありがとうございます。 SNAKESでは唇検出は難しいですか。参考にしながら自分なりにもうちょっと頑張ってみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 画像処理(高精度な輪郭検出)について

    今年新卒で入社し、医療機器関連のエンジニアとしてスタートしたものです。素人ながら質問させていただきたいと思います。 現在、Visual Studio 2010(言語はC#)とOpenCVを用いて、画像中の輪郭、物体をできるだけ高精度に検出するアルゴリズムの研究を行っています。 基本である差分計算やOpenCVの関数を用いたラプラシアンフィルタやCannyアルゴリズム、輪郭線抽出、RGBからHSV,Lab色空間(Labについては現在も調査中です。)へ変換し、閾値を変えてみるなど試してみました。また、PhotoShopを用いて、コントラストや明るさ、色調変換をかけて、同様に試してみたりもしました。 しかし、画像によっては満足いく輪郭、物体の検出ができない状態です(フリーソフトの輪郭検出器2.10を使ってみても同じでした)。勿論、明るさやレンズの特質等の影響もあるとは思いますが・・・。 そこでお聞きしたいのですが、上記の他にもできるだけ高精度に輪郭や特徴点を検出する手法がありましたら、教えていただける範囲で教えていただけないしょうか。 漠然とした質問で申し訳ありません。どうぞよろしくお願い申し上げます。 今のところ検討中なのは、対象画像に何らかのフィルタをかけて、それから差分や大津の2値化閾値判定を使う、特徴点抽出には、OpenCVのコーナー検出アルゴリズム(Harris等)やSURF等を使うことを考えています。 勿論、上記の事項に応用的に工夫を加える独自のアルゴリズムも検討中です。

  • OpenCVを使って画像のノイズ除去を考えています

    OpenCVを使って画像のノイズ除去を考えています。 ですが、プログラムで上手く動いてくれないところがあり、分からなくて困っています。 もしわかる方がいらっしゃれば是非教えてください。 OpenCV2.4.6,VisualC++2010を用いています。 OpenCVを使わないLabeling.hなどを使った似たようなプログラムを教えてくださっても構いません。 ただ、Labeling.h自体がよくわからなく、Labeling.hを使って書いたプログラムが動かない状態であり、OpenCVの方がまだわかるので今回はOpenCVで質問しました。 プログラム(OpenCVを使った)の詳しい説明です。 入力画像の黒い点すべてがノイズだとします。またノイズのサイズは500以下だとします。 またサイズは特に指定はありません。拡張子は24bitのbmpを使っています。 画像の左側が入力画像とした時、画像の右側のように出力されます。(画像では分かりやすいように画像の切れ目を青の枠で囲っています。) 出力画像のふち?の部分が1ピクセルの範囲だけノイズ除去されずに残ってしまいます。(画像では分かりずらいですが赤の矢印の先の部分です。) 画像の下側のように赤のふち?1ピクセルの範囲はノイズ除去されません。 原因を考えているのですが、自分では分からなく困っています。 もしわかる方がいらっしゃれば是非教えてください。 私自身、プログラムは大学の授業レベル、OpenCVは使い始めて数ヶ月なので詳しくないです。 よろしくお願いします。 プログラムの内容は以下のようになっています。 〇〇〇は入力画像のファイル指定先 ●●●は出力画像のファイル指定先 ノイズのサイズは500以下とします。 自分は輪郭追跡のcvPointの部分が怪しいと考えてます。 今書いてるプログラムから一部抜き出してきたのでもしかしたら余計な処理が入っているかもしれません。 一応コピペでライブラリの設定、入力・出力画像のファイル指定をしていただくと動くと思います。 #include "stdafx.h" #include <stdio.h> #include "opencv/cv.h" #include "opencv/highgui.h" int _tmain(int argc, _TCHAR* argv[]) { IplImage *Proc;//処理画像 int i; char input_fname[256]; //元画像読み込み先 char output_fname[256]; //処理後画像出力先 //輪郭情報 CvMemStorage* Storage;//メモリストレージ CvSeq* Contours=0;//輪郭データ int Count=0;//輪郭の数 double Area=0;//面積 Storage=cvCreateMemStorage(0);//メモリストレージを確保 sprintf(input_fname, "〇〇〇"); sprintf(output_fname, "●●●"); IplImage *Input = cvLoadImage( input_fname, CV_LOAD_IMAGE_GRAYSCALE); if( Input == NULL ){ printf("ファイルが読み込めません。\n"); cvWaitKey(0); // キー入力待機 return -1; } // (1)二値化(大津の手法を利用) cvThreshold (Input, Input, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);//大津の二値化を用いて色を反転させる Proc = cvCreateImage(cvGetSize(Input), Input->depth, 1);//処理画像 cvCopy(Input,Proc,NULL); //輪郭を取得 Count = cvFindContours(Proc,Storage,&Contours,sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)); //輪郭情報の取得 for(i=1;i<=Count;i++){ Area=abs(cvContourArea(Contours));//面積 if(Area<500){//面積が500以下の場合、黒で塗りつぶす cvDrawContours( Input, Contours, CV_RGB(0,0,0),CV_RGB(0,0,0), 0, CV_FILLED);} Contours=Contours->h_next;//次の輪郭へ } cvThreshold (Input, Input, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);//大津の二値化を用いて色を反転させる cvSaveImage(output_fname,Input);//矩形描画した画像を保存 //画像情報解放 cvReleaseImage(&Input); cvReleaseImage(&Proc); }

  • 使用する言語(画像処理)

    現在大学で情報系の研究を行っています。 「画像ファイルを読み込んでエッジを検出、エッジのラインで囲まれている部分を一つの領域として取得する」というプログラムを作りたいと思っています。 かなり分かりにくい説明だとは思うのですが、例を挙げますと・・・ 世界地図をスキャナで読み込む ↓ 取得した画像ファイルをプログラムに読み込ませる ↓ 各国の輪郭をエッジとして検出、輪郭以外は真っ白にしてモノクロ化 ↓ エッジで囲まれている部分(国の領土)をそれぞれ一つのオブジェクトとして認識できる。つまり、一枚の画像としてではなくそれぞれの国の領域を持つオブジェクトとして保持することができるようにする。 このようなプログラムを書きたいと思っています。しかし現在はC言語の知識しかなく、他にVisualBasicやJava、C++なども考えていますがどの言語がこのような処理に適しているのか分かりません・・・ どの言語でも書こうと思えば書けるものなのでしょうか?それともそれぞれの言語に得意分野があるのでしょうか?

  • ノイズ処理の原理

    カラー画像からある色の抽出を行うに当たって、ノイズ処理を行うことになり、ネットで検索をし処理方法を見つけてきました。 環境はVC++上でOpenCVというC言語のライブラリーを使用しています。 処理方法は、openCVの関数を使用し cvPyrDown( imgA, imgB, 7 ); // 7 ピクセル縮小 cvPyrUp( imgB, imagA, 7 ); // 7 ピクセル拡大 といった 前画像に対して、7ピクセル縮小処理を行い、結果画像に対して7ピクセル拡大することによって、ぼやけた感じの画像が完成し、色抽出がうまくできました。 しかし、何故この方法でうまく出来たのかの原理がいまいち分からずすっきりしていません。 よろしければ、誰か理由を教えていただけないでしょうか??

  • 画像処理について

    プログラミング初心者です。 今、画像処理のプログラムを作りたいのですが 何でやればよいか、迷っています。 処理は以下のとおりです。 写真画像(jpg)を開く /バック白、顔の画像 輪郭を抽出 その外側を(白の部分)を透明にする pngで保存 ファイル名に日時(0808281338)などをつける 指定のフォルダに保存 Cは少し書けるのですが、画像処理はやったことがありません。 またActionScript、MAXMSPはそこそこ使えます。 processingも少し。 この中でやりやすく、またほかのアプリとの連携なども考え よりよい方法がありましたらご教授いただけると幸いです。 また、よいライブラリなどございましたら、ぜひお教えください。

  • 映像処理

    CMOSカメラモジュールから映像を取り込みパソコンで処理をしようと考えています。 プログラムはカメラからの映像をパソコンに表示しつつ、映像に写っている球体の位置(CMOS上の座標で)を0.1秒おきに計算しようと思っています。 このプログラムを作るためにはどの程度の知識が必要でしょうか。 また、0.1秒おきの座標計算というのは現実的でしょうか。 環境は PC OS:WindowsXP SP3 CPU:CORE 2 DUO 2.4G or Pentium3 1.2G カメラ 画素数:640x480 PCとのインターフェイス:未定 知識レベル Visual Basicで静止画像の簡単な処理(濃度,サイズ変換、ラプラシアン) 最近、はじめての画像処理プログ・・・ というのを買い読み始めました。 よろしくお願いします。

  • C言語での平滑化フィルタ

    OPenCVを使わずにC言語で3×3の平滑化フィルタを作成したと思っています。 それで、プログラム例を参考にして作ろうと、googleなどで検索しているのですけれども、なかなかファイルの読み込みから平滑化処理まで全てを書いてくれているプログラム例が見つかりません。 もしご存知の方がいらしたら、コンパイル可能な状態のプログラム例を教えて頂けないでしょうか? 環境はwindows VISTAでVisual Studio2008を使っています。 画像サイズなどはこだわりません。

  • 本を探しています、昔読んだ画像処理の本です

    昔読んだ画像処理の本を探しています。 大学の図書館にあって、研究室で卒論の時に読んで基礎を勉強した本なのですが、今ではタイトルを忘れて検索しても見つけられなくなっています。 自分でも今でも手元に置いておきたい本で定期的に探しているのですが、辿り着けなくなっているので この様な内容の本なのですが、もし分かる方がいらっしゃれば教えてください。 ・C言語の画像処理の本 ・入門書でサンプルコードが付いている 載っていたサンプルコードは記憶にあるものだと以下の物だったはずです ・2値化 ・平滑化 ・輪郭検出 ・ヒストグラムの生成 ・sobelフィルタ ・顔画像認識(書籍の最後のあたりのはず) 他にも画像処理の本はありますが、これが一番欲しいバランスで画像処理の解説を出来ていて、人に薦めたい内容になっていました。 自分もこれ読んで勉強した記憶のある方など、お力をお貸しください。

  • 画像ボードのバッファにある画像をOpenCVで処理する方法を教えてください

    カメラの画像をグラフインというメーカーの画像ボードを介してPCに取り込んでいます。 ここでその画像をOpenCVを使用して処理しようとしています。 一度保存した画像を処理するのはできるのですが、 画像ボードのバッファからデータを読み込んできてきて処理する方法が分からず困ってます。 Iplimageという構造体にデータを入れればよさそうなのですが、 その変換のやり方がわかりません。 開発環境はWindowsXP visual C++ 2005 MFC です。 当方、プログラムを始めたばかりなので できれば詳しく教えて頂けると助かります。 よろしくお願いいたします。

  • 色領域の検出

    opencvのプログラムを用いてある色の位置情報を検出したいのですが、 何を用いていいか分かりません。 マスクを用いてある色の領域だけを取り出す参考のプログラムは見つけたのですが、それではあとで全体の画像の処理ができないので困っています。