• 締切済み

Canny法に用いる閾値の決定法について

とあるプログラムをしている者です。 Canny法を用いてエッジ抽出を試みているのですが、 ヒステリシス閾値で用いる高い閾値と低い閾値の適切な決定法がわかりません。 最終的には抽出の対象となる画像ごとに適切な閾値を設定し 処理をかけたいと考えています。 しかし、対象とする画像の背景と抽出したいオブジェクトの色の濃度が 画像によって大きく変化するため、従来の決定法では対応しきれていない現状です。 そこで、Canny法に用いる適切な閾値の決定法がありましたら ぜひご教授頂きたいと思います よろしくお願いします

みんなの回答

回答No.1

解析というのは解析者の目的ありきです。 何かしらのフィルタをかける場合に何が「適切な決定法になる」かは 機械ではなく、人間がどう決めるか(どういう結果をよしとするか)次第なので 例えば、PhotoShopのような画像処理系統のソフトを作りたい場合は 閾値等の決定は PhotoShopが実際にそうであるように その都度結果画像をプレビューしながらトラックバーや数値をアップダウンさせられるコントロールなどでユーザーが任意に行える という方法にするとよいでしょうし、かなり現実的だと思います。 (「中でもこういう感じの画像を処理するのが得意としたい目的のアプリ」という大よその方向性があれば、デフォルト値とかは実際にやってみて決めればいいのではないでしょうか) 決まった画像を読み込み独自のシェーダを使う、ゲームなどの場合であれば それはもう自分の満足のいくように実験で決めるということになるかと。(画像ごとに変えるなら閾値の情報も保存しておくようにするなど) もし、そういうことをかなりのレベルでほとんど自動化したいのであれば、自分の目的に合った「学習アルゴリズム」や「学習データ」(過去にどういう画像はどう処理されたかの履歴から、任意の統計学的手法で計算するプログラム)などを作成する必要が出てきそうです。度合い次第では、結構大変かもしれません。 実際のフローでは もしご自身で細かいとこまで書かれている場合は Canny法の流れは ガウシアン → Sobel → 細線化 → 2値化 ということで 仮にヒステリシス閾値 での2つのパラメーターだけいじればいいなら 細線化までの情報を一端持っておいて パラメータ変更時にそれにフィルタかけるだけにすれば、ほとんど無駄がないと思います。

関連するQ&A

  • '{' : 対応する関数ヘッダーがありません

    このようなエラーの解消はどうすれば直りますか? うまく画像を出力できるようになりますか? #include "OpenCV_IALIB.h" #define Xsize 256 #define Ysize 256 int pcInImage24[Ysize][Xsize]; int pcoutImage24[Ysize][Xsize]; void print_identity(unsigned char *clue); /* この関数での処理 */ // 制御パラメータ static int g_sbl_xOrder; static int g_sbl_yOrder; static int g_sbl_apertureSize; static int g_lap_apertureSize; static float g_can_thr1; static float g_can_thr2; static int g_can_apertureSize; static int g_debug; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); { FILE *fp; fp=fopen(argv[1], "rb"); fread(pcInImage24, Xsize*Ysize*sizeof(char), 3, fp); fclose(fp); MSG msg; IA_SYS_INFO sys; g_sbl_xOrder = 1; g_sbl_yOrder = 0; g_sbl_apertureSize = 3; g_lap_apertureSize = 3; g_can_thr1 = 50.0F; g_can_thr2 = 200.0F; g_can_apertureSize = 3; g_debug = 0; /***** 制御パラメータ登録 *****/ IA_Eval_RegisterParam( &g_sbl_xOrder, "エッジ抽出", "Sobel・x導関数の次数", 1, 1, 1, 2, "x導関数の次数" ); IA_Eval_RegisterParam( &g_sbl_yOrder, "エッジ抽出", "Sobel・y導関数の次数", 1, 1, 0, 2, "y導関数の次数" ); IA_Eval_RegisterParam( &g_sbl_apertureSize, "エッジ抽出", "Sobel・オペレータサイズ", 1, 1, 1, 7, "オペレータサイズ" ); IA_Eval_RegisterParam( &g_lap_apertureSize, "エッジ抽出", "Laplacian・オペレータサイズ", 1, 1, 1, 7, "オペレータサイズ" ); IA_Eval_RegisterParam( &g_can_thr1, "エッジ抽出", "Canny・1番目の閾値", 1, 1, 0, 255, "1番目の閾値" ); IA_Eval_RegisterParam( &g_can_thr2, "エッジ抽出", "Canny・2番目の閾値", 1, 1, 0, 255, "2番目の閾値" ); IA_Eval_RegisterParam( &g_can_apertureSize, "エッジ抽出", "Canny・オペレータサイズ", 1, 1, 2, 7, "オペレータサイズ" ); IA_Eval_RegisterParam( &g_debug, "Debug", "Debug出力有効", 1, 1, 0, 1, " 0=デバック出力なし\n 1=デバック出力あり" ); fp=fopen(argv[2], "wb"); fread(pcoutImage24, Xsize*Ysize*sizeof(char), 3, fp); fclose(fp); return 0; }

  • c++のプログラミングにて

    青い背景にボールが映っている画像があります HSB値に対する閾値処理を行いボールだけを抽出したいのですが プログラミング素人の自分には全くわかりません サンプルプログラムやヒントなどをどうかお願いします

  • 酢酸の濃縮法

    酢酸の濃縮法についてお聞きしたいのですが、具体的にどのような方法があるのでしょうか? 水中の酢酸イオンをイオンクロマトグラフィーで測定したいのですが、濃度が低い為、中々結果が得られません>< 文献やら参考資料やら色々探しているのですが、酢酸を溶媒等として用いた抽出、濃縮や酢酸の合成法等は読んだのですが、水中のきわめて微量な濃度の酢酸、又は酢酸イオンそのものの濃縮方法が中々見当たらないのが現状です。。。 よろしくお願いします。

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

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

  • 黒濃度が300%を超えている箇所の抽出

    画像やオブジェクトの黒い部分がCMYK合わせて濃度300%を超えている箇所を 確認する、もしくは抽出する方法やソフトはありますでしょうか? 今はスポイトで濃そうな部分を選択して カラースライダで少しずつ確認しながら濃度を調節しているのですが 確認漏れがありそうで不安です。 MacOSX10.5.8/Illustrator CS4/Photoshop CS4 使用です よろしくお願いいたします。

  • 画像を透過させたい

    GIFやJPGにしたときに、 対象物の周りを透過させたいのですが、 現状できていません。 そのため、対象物以外の背景部分が whiteになって、 ページ背景色にういた画像貼り付けになってます。 どうしたら透過させることができるんでしょうか? photoshopやoffice系で使えるものがあれば 教えてください。

  • C++(DirctX)でのスプライトの透過処理

    2次元画像を表示出来るスプライト、便利なのでよく活用しているのですが 透過を行う際に一つ問題がありまして・・・ http://d0ec7852ef61.seesaa.net/article/115229599 … ↑のサイトを参考に透過を行った結果 スプライトの透明度の変更自体は可能になったのですが その透過した奥側に存在したはずの3Dオブジェクトが描画されず 3D空間だけが透過の先にあるという状態になってしまい、困っています。 スプライトが透過された先の3Dオブジェクトがちゃんと表示されるようにしたいのですが 可能ですか? <表示の補足説明> 透過前 スプライト画像→3Dオブジェクト→3D空間の背景 透過後(希望) スプライト画像(半透明)→3Dオブジェクト(欠損なし)→3D空間の背景 透過後(現状) スプライト画像(半透明)→3Dオブジェクト(スプライト画像と重なる部分表示されず)→3D空間の背景

  • AfterEffectsでクロマキー合成を行う時にマスクのようなもので画像保護ができますか?

    はじめて質問をさせていただきます。 先日、クロマキー合成をするためにAfterEffectsCS4を購入しました。 そこで質問なのですがクロマキー合成のためにブルースクリーンの部分の色をスポイトで取って許容範囲を広げ、色をある程度まで透明にした後、完全に背景だけ透明にしようとすると最後にどうしても類似色が残ってしまい、背景が残るか画像の残したい部分まで透明になってしまうか、という状態になってしまいます。 この類似色の、画像を残したい部分にマスクのようなもので画像保護をし、背景の色のみ透明にする事は可能なのでしょうか? それとも撮影の時にブルーシートと正反対の色のものを使い、スポイトでちまちまと全て背景を抜くしかないのでしょうか? あともう一つ、ブルースクリーンと撮影対象物との境が粗く残ってしまい、エッジのぼかしをすると今度は変にぼけて染みのようなものが浮かんできてしまいます。 境界線をうまくぼかす方法がありましたら教えてください。 どうぞよろしくお願いします。

  • Photoshopの画像サイズ変更の内部処理について

    現在画像処理プログラムをC言語で作成しているのですが、画像の拡大縮小、 回転、平行移動の機能をもたせたアフィン変換のプログラムで、画像の濃度値 の補間方法を最近傍法、線形補間法、三次補間法の3つから選べるようにして います。 プログラムはほぼ完成し、ためしに画像の拡大縮小、回転、平行移動を含む様 々な処理をやらせてみましたが、目で結果を確認する限り、ほぼできています。 しかし、三次補間法を使用してある画像の縮小をやったときに、画像の縮小は できているのですが、画像処理ソフトPhotoshop5.5を使用したものと微妙に結 果が異なってしまいます。これが、後々の処理に効いてくるため、最終的な結 果に大きく影響します。 三次補間法では、対象画素の近傍の16個の濃度値で標本化関数の近似によっ て濃度値を計算するという一般的によく用いられている方法をとっています。 これを、近傍の16個の濃度値を用いて、標本化関数の近似ではなく、標本化 関数を用いて補間濃度を計算してみると、目で結果を確認する限り、少し Photoshop5.5に近づきました。 他にも、自分なりにいろいろ調べた結果、画像の縮小だけであれば、一度、変 換前の画像サイズと変換後の画像サイズの最小公倍数に拡大して、最小公倍数 分の画素の濃度値の平均をとっていくという手法もわかりました。 しかし、Photoshop5.5では、補間方法はnearlest,bi linear,bi cubicとなって おり、明らかに最近傍法、線形補間法、三次補間法の3つを用いています。私 の予想では、三次補間法の濃度値の補間法が違うのではないかと考えておりま す。 どなたか、Photoshopに限らず、一般的な画像処理ソフトなどで用いられている 画像サイズの変更の内部処理について教えていただけないでしょうか。

  • C言語でwavファイルをいじりたいのですが

    C言語でwavファイルを操作したいと思っています。 一つは音量をdbで求めるというもので、自乗平均法を用いて音量を求め、時間変化を出力せよ。ただし、音量の単位はdb、区間長は30ms。 このような条件です。wavの読み込みはできるのですが、そこから進みません。 自乗平均法で調べると、株価がどうとかっていう資料だらけでよくわかりません。 2つ目は周波数スペクトルを求めるもので、音量に時間変化において、閾値以上の値が連続する区間における1024ポイントを対象とすること。 問題の意味がよくわかりません。。。 2点についてご教授いただけたらと思います。

専門家に質問してみよう