• ベストアンサー

画像処理においてグラフカットに詳しい方に質問します

現在、医療画像処理の研究を行っています。 その中でグラフカットを使用するのですが、n-link,、t-linkの値は全て出ていると思うのですが、最後のカットの仕方がどうしてもわかりません。 フォード・ファルカーソンのアルゴリズムでカットしようと思っています。アルゴリズムは理解できているんですが、実装の仕方がどうしてもわかりません。全探索しないといけないのでしょうか? 詳しい方がいれば、ぜひ教えて頂きたいです。わかりやすい参考URLなどがあればそちらも教えて頂ければ幸いです。使用言語はC++です。 よろしくお願い致します。

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

  • ベストアンサー
  • osumk
  • ベストアンサー率100% (1/1)
回答No.1

はじめまして. 基本的にグラフカットでは,グラフが正しく構築出来ていれば(n-link,t-linkが正しく計算出来ていれば), どのような最大フローアルゴリズムを使っても構いません. プログラムは最大フローでググるといくつか出てくると思います. フォードファルカーソンアルゴリズムは単純なアルゴリズムですが, グラフカットで使うような画像では計算に時間が掛かり過ぎることがあると思います. グラフカットで用いられる疎なグラフに対して高速なBKアルゴリズムというのがあるので, 余裕があるなら調べてみるといいと思います. また,OpenCV2.xではグラフカットが標準で実装されているので(grabcut.cpp), 参考になると思います.OpenCVのGrabCutもBKアルゴリズムを使っています.

関連するQ&A

  • C言語による最大流アルゴリズム

     最大流問題を解くC言語のコードを載せた本を探しています(『本』限定でお願いします).  「最大流問題」とは,グラフの二点間の最大流を求める問題です.フォード・ファルカーソンのアルゴリズムがその基本として有名です.  どなたかご存知ないでしょうか?

  • 探索二分木をバランス化する。

    書き込みや削除を繰り返して深さに差の出た探索二分木をバランス化する手続きを作りたいのですが、どのようなアルゴリズムで組めばよいでしょうか。 使用言語はPascalです。 よろしくお願いします。

  • 最長経路探索

    グラフの最長経路(クリティカルパス)を求めたいのですが、 ・閉路無し有向グラフ ・重み付きグラフ(辺ではなくノードの方に重みがある) ・スタートとゴールのノードが各々1つ与えられている ・スタートからどの経路を辿ってもゴールには辿り着く 以上のような条件の時に、どのようなアルゴリズムを用いれば良いのでしょうか? 幅優先探索で求められそうな気がしたのですが、どうも上手くいきません。 言語はVBAで、そもそも詳しくないのですが、 考え方など教えて頂けないでしょうか。 お願い致します。

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

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

  • ☆★大学院入試のアルゴリズムに関する科目について★☆

     ご覧頂きありがとうございます、私は大学の機械科に在籍している3年生です。  来年の8月に電気通信大学の大学院(IS)を受験する予定なのですが、入学試験科目の中にデータ構造とアルゴリズムという本格的には勉強したことのない科目があります。  そこでこの科目についてお勧めな参考書、勉強法などがありましたら教えて下さい、私はC言語は使えるのでC言語で説明されている参考書でも構いません、よろしくお願いします。 -----------------------------詳しい範囲-------------------------------    [データ構造とアルゴリズム] 計算機のプログラミングで用いられるアルゴリズムとデータ構造についての理解を問う。具体的には、線形リスト,スタック、キュー、探索、整列、グラフアルゴリズム、アルゴリズム解析などから出題する。基本的なプログラミングの素養を必要とする。

  • 軌道計算

    ざっくりとした質問の仕方で申し訳無いのですが、C言語でピンボールゲームを作りたいと思っている者です。 私の今の実力はブロック崩しを参考書を見ながら作れる程度です。 ピンボールの玉の動きをシミュレートするのに物理の法則を完璧に実装するのは物凄く大変な事は色々調べて分かったのですが、2Dで良いので(教えて頂けるのであれば3Dの物でも良いです)違和感無い程度で玉の動きを実装出来ればと思っています。 そこで、C言語で玉の動きのアルゴリズムの参考になるHPか参考書を教えて頂きたいのです。そのものずばり、このコーディングで玉の動き、もしくはピンボールゲームはOKなんてあったら最高なんですが...宜しくお願いします

  • はさみにへばり付く金属リチウムの処理方法

    今度、大学の研究室の実験で金属リチウムを使用する事になりました。が、その処理(廃棄)の仕方で困っています。これまで研究室で使っていなかったもので先輩に聞いてもわからないし、先生も答えはあるから自分で探せ見たいなこといってます。使った試料自体は所定の場所に集めておいて廃棄すればいいのですが、金属リチウム箔をカットしたはさみに付着してしまうリチウムをどうしたらうまくとる事が出来るか考えているところです。金属リチウムが付着しない特殊な刃物を探せばいいのかそれともうまい処理法があるのかアドバイスください。

  • 大学院の専門科目(情報学科)のお勧め参考書☆★

     ご覧頂きありがとうございます、私は現在機械科に所属する大学3年生です。  来年に他大学の情報科の院を受験したいのですが、入学試験科目に「データ構造とアルゴリズム」「計算機システム」という今までに勉強したことのない科目が含まれていて、その対策としてとりあえず基本情報技術者試験の勉強をしていますが、対策としては十分でない気がします。  もしご覧になっている皆様の中に上記二つの科目についてお勧めの参考書、又は勉強法をご存知な方は教えてもらえないでしょうか?どうぞよろしくお願い致します。 ------------------詳しい範囲-------------------- [計算機システム] 計算機の物理的、論理的な構造、機能、動作に関する理解を問う。具体的には、計算機アーキテクチャおよびオペレーティングシステムについて、機械語命令、アセンブリ言語、命令実行パイプライン、割込み制御、記憶階層、プロセス管理、記憶管理、同期管理、ファイル管理などから出題する。 [データ構造とアルゴリズム] 計算機のプログラミングで用いられるアルゴリズムとデータ構造についての理解を問う。具体的には、線形リスト,スタック、キュー、探索、整列、グラフアルゴリズム、アルゴリズム解析などから出題する。基本的なプログラミングの素養(私はC言語は使えます)を必要とする。

  • プログラマにとって「アルゴリズム」や「データ構造」の知識は必須ですか?

    最近の、いわゆるパッケージソフトウェアや、Webアプリケーションの開発においては、 必要なコンポーネントをインポートして部品を組み立てていくイメージで コードを書いていくというのが主流だと思います。 ほとんどのプログラミング言語には、すでに便利な関数やパッケージが用意されており、「アルゴリズム」や「データ構造」といった知識はあまり必要になりません。 例えば、データをソートしたい場合、クイックソートなどで自分で実装しなくても、すでにソート関数が用意されているので、その関数を使用すれば良いわけです。 そのような環境においても、プログラマにとって「アルゴリズム」や「データ構造」の知識はやはり必須ですか? 時々、 ・「優先順位付き待ち行列」くらいは、スラスラ実装できなければ、プログラマとしては半人前 ・「離散数学」をしっかり理解していないと、プログラマとしては致命的 などという話も聞くのですが、皆さんの意見を聞かせてください。

    • ベストアンサー
    • Java
  • C++における並列処理に関する質問です。

    現在赤黒木の改良を考えているのですが、赤黒木におけるノードの挿入操作は、ノードが多くなるとリバランスに非常に時間がかかります。 そこで、プログラム内で挿入操作が必要となった時に、挿入操作を行うスレッド(もしくはプロセス)を新規で作成し、挿入に関してはそのスレッド、その他は元のスレッドが実行というように並列で行いたいのですが、どのようにスレッドを作れば良いか分からない為、教えてください。 挿入における排他制御(フラグ管理)などのアルゴリズムの部分は勉強したので、スレッドの作成方法が知りたいです。また、再帰を頻繁に行うプログラムなので、スレッド作成数の上限も設定したいです。 参考にしている論文 http://uc.alerta.cl/xmlui/bitstream/handle/123456789/1413/586394.pdf?sequence=1 なお、開発環境はVisual C++ 2012で、OpenMPも使用できます。ただオブジェクト指向に慣れていないため、ほとんどC言語で書いています。 以下に、簡単なソース、及び図を載せますので、お手数をおかけしますがアドバイスをいただけないでしょうか? (簡単なソース) main(){ x = f1(); } int f1(){ if() y = f1(); //再帰を頻繁に行います if() insert(); //挿入はスレッドを新規に作成し、元のスレッドと並列で実行(複数の挿入スレッドが同時に存在しうる) return y; } p.s. 同じ内容の質問をyahoo知恵袋でも出しているのですが、回答してくれた方への質問に答えたりが出来ない為、こちらに転載させていただきました。 また、CreateThread()で実現できそうというアドバイスも頂けたのですが、もう少し具体的な実装方法が調べても分からなかったので、その点に関してのアドバイスでも十分ですので、よろしくお願い致します。