画像応用数学特論 木3 414 Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 目的 • 階層グラフカットで両眼ステレオマッチング – 既存研究を理解するのにいい勉強になる • ウェブで無料でソースコードを公開 – 公共の利益に役立てる – 他人が見て分かりやすいソースコード,分かりやすい説明書,使 いやすいソフトウェアの開発に慣れる • 精度と速度のコンテストを行うかも? – あまり新規性を出すと『授業』というより『研究』になってしまうの で,あまり斬新なアイディアは盛り込まないほうがいいかも – 既存研究を組み合わせて性能を上げる • 理論のしっかりした方法を使うことで,ユーザが安心して使え るようにする CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 10/8課題:画像読み込み • • • • 〆切:10/13(翌週の火曜日)の18時 提出ファイル:HTML&GIF&JPG, PDF, Word 枚数:A4相当,任意のサイズ 提出先:miyazaki @ hiroshima-cu.ac.jp • 理論とアルゴリズムと過程と結果と考察をまとめ,ソースコードの提出は不要 • 名前,学籍番号,メールアドレス,日付,も報告すること 1. 以下のサイトから画像をダウンロードし,好きな画像ファイルフォーマットに変換する 1. 2. http://cat.middlebury.edu/stereo/data.html http://vision.middlebury.edu/stereo/data/ 2. 画像ファイルを読み込み,何らかの処理をして,画像ファイルを出力するプログラムを作成せよ 1. 2. 3. 処理はエッジ計算,色変換,など何でも良い 1. PDFファイルに処理内容を記せ 画像ファイルのフォーマットは何でも良い 1. PDFファイルにフォーマットを記せ 使用するOS,開発環境(コンパイラ・インタプリタ),プログラミング言語,ライブラリは何でも良い 1. PDFファイルに上記の内容とバージョン,CPUやメモリなど,を記せ 2. ライブラリを使用する場合は,そのインストール方法や使い方の解説も記せ 3. なお,この授業で紹介するグラフカットのライブラリはC/C++で書かれているので,C/C++で実装しな いとつらい可能性が非常に高い CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 10/15課題:ステレオ計算 • • • • 〆切:10/20(翌週の火曜日)の18時 提出ファイル:HTML&GIF&JPG, PDF, Word 枚数:A4相当,任意のサイズ 提出先:miyazaki @ hiroshima-cu.ac.jp • 理論とアルゴリズムと過程と結果と考察をまとめ,ソースコードの提出は不要 • 名前,学籍番号,メールアドレス,日付,も報告すること 1. 以下のサイトから画像をダウンロードし,好きな画像ファイルフォーマットに変換す る 1. 2. http://cat.middlebury.edu/stereo/data.html http://vision.middlebury.edu/stereo/data/ 2. 対応する2枚のステレオペア画像ファイルを読み込み,ステレオマッチングを行い, 視差を画像ファイルにして出力するプログラムを作成せよ 1. 2. 3. 画像ファイルのフォーマットは何でも良い 使用するOS,開発環境(コンパイラ),プログラミング言語,ライブラリは何でも良い 実装したステレオマッチングの計算方法をPDFファイルに記せ 1. 視差が例えば0~15ピクセルの場合は,0~15の濃淡画像を出力せよ 2. ただし,PDFファイルに載せる際は見やすくするため,0~15の濃淡画像を0~255の濃 淡画像に変換してから載せよ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 10/22課題:グラフカットしてみる • • • • 〆切:10/27(翌週の火曜日)の18時 提出ファイル:HTML&GIF&JPG, PDF, Word 枚数:A4相当,任意のサイズ 提出先:miyazaki @ hiroshima-cu.ac.jp • 理論とアルゴリズムと過程と結果と考察をまとめ,ソースコードの提 出は不要 • 名前,学籍番号,メールアドレス,日付,も報告すること 1. 前のスライドのURLからグラフカットのライブラリをダウンロードし, 自身の開発環境に設定する 2. 今回出てきたグラフ構造を解くプログラムを作成せよ 1. 2. 3. どのグラフ構造でも良い 使用するOS,開発環境(コンパイラ),プログラミング言語,ライブラリは 何でも良い 実装したグラフ構造をPDFファイルに記せ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 10/29課題:領域分割で2値グラフカット • • • • 〆切:11/3(翌週の火曜日)の18時 提出ファイル:HTML&GIF&JPG, PDF, Word 枚数:A4相当,任意のサイズ 提出先:miyazaki @ hiroshima-cu.ac.jp • 理論とアルゴリズムと過程と結果と考察をまとめ,ソースコードの提 出は不要 • 名前,学籍番号,メールアドレス,日付,も報告すること 1. 好きな画像ファイルを用意する 1. 自分でシンプルな画像を作成してもよい 2. 2つの領域に分割するプログラムを作成せよ 1. 2. 3. 単純な画像でも良い(2色+ノイズ,など) 使用するOS,開発環境(コンパイラ),プログラミング言語,ライブラリは 何でも良い 実装したアルゴリズムをPDFファイルに記せ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 11/5課題:α拡張でノイズ除去 • • • • 〆切:11/24(数週間後の火曜日)の18時 提出ファイル:HTML&GIF&JPG, PDF, Word 枚数:A4相当,任意のサイズ 提出先:miyazaki @ hiroshima-cu.ac.jp • 理論とアルゴリズムと過程と結果と考察をまとめ,ソースコードの提 出は不要 • 名前,学籍番号,メールアドレス,日付,も報告すること 1. 好きな画像ファイルを用意する 1. 必要に応じて,画像処理ソフトでノイズを加える 2. α拡張アルゴリズムを使ってノイズ除去をするプログラムを作成せよ 1. 2. 使用するOS,開発環境(コンパイラ),プログラミング言語,ライブラリは 何でも良い 実装したアルゴリズムをPDFファイルに記せ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 11/26課題:階層グラフカットでステレオ • • • • 〆切:12月1日の18時(進捗状況),1月14日の授業中(プレゼン),1月14日の18時(ソースコード) 提出ファイル:HTML&GIF&JPG, PDF/Word, ppt等のプレゼンファイル,ソースコードのファイル 枚数:A4相当,任意のサイズ 提出先:miyazaki @ hiroshima-cu.ac.jp • • • • 12/1: 理論とアルゴリズムと過程と結果と考察をまとめ,HTML/PDF/Word/pptを提出 1/14:理論とアルゴリズムと過程と結果と考察をまとめ,プレゼンを授業中に発表(ノートPCは各自用意) 1/14: ソースコードとその使用方法・コンパイル方法,画像形式・ライブラリのインストール方法の説明を提出. HTML&GIF&JPGで作成.日本語版と英語版の両方を作成. 名前,学籍番号,メールアドレス,日付,も報告すること 1. 以下のサイトから画像をダウンロードし,好きな画像ファイルフォーマットに変換する 1. 2. 2. 3. 対応する2枚のステレオペア画像ファイルを読み込み,α拡張アルゴリズムを使ってステレオマッチングを行い,視差 を画像ファイルにして出力するプログラムを作成せよ 対応する2枚のステレオペア画像ファイルを読み込み,階層グラフカットアルゴリズムを使ってステレオマッチングを 行い,視差を画像ファイルにして出力するプログラムを作成せよ 1. 2. 3. 4. http://cat.middlebury.edu/stereo/data.html http://vision.middlebury.edu/stereo/data/ 画像ファイルのフォーマットは何でも良い 使用するOS,開発環境(コンパイラ),プログラミング言語,ライブラリは何でも良い 実装したアルゴリズムをPDFファイルに記せ 1. 視差が例えば0~15ピクセルの場合は,0~15の濃淡画像を出力せよ 2. ただし,PDFファイルに載せる際は見やすくするため,0~15の濃淡画像を0~255の濃淡画像に変換してから載せよ α拡張でのステレオと階層グラフカットでのステレオとの速度・精度を比較せよ 1. [任意課題] 余裕があれば,様々なコスト関数での結果の違いや,様々な重みでの結果の違いを比較せよ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 12/3課題:ITSシンポ12/10&11 • • • • 〆切:12/15(翌々週の火曜日)の18時 提出ファイル:テキストファイル,メールの本文,その他 枚数:任意のサイズ 提出先:miyazaki @ hiroshima-cu.ac.jp • ITSシンポの参加費を無料に出来るように交渉する予定. もしできなかったら今回の課題は無し,とする • 名前,学籍番号,メールアドレス,日付,も報告すること 1. ITSシンポに1.5時間以上参加し,感想文を書け CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 2 領域分割・ステレオ・視点補間・照度差ス テレオ法・ノイズ除去・影除去,課題は画像 読み込み 10/08 [#02] コンピュータビジョン・コン ピュータグラフィックスの分野におけるグラ フカット(最大流・最小カットアルゴリズム) とマルコフ確率場 Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノイズ除去 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカット • 広く言えばグラフを切るアルゴリズム(max-flow/mincut,Normalized Cut, Swendsen-Wang Cut, 等)は 全てグラフカットと言えるが,この授業ではmaxflow/min-cutアルゴリズムを使ってMRF問題を解く方 法をグラフカットと呼ぶことにする – max-flow/min-cut問題を解くFord-Fulkersonアルゴリズム やPush-relabelアルゴリズムをグラフカットと言ったほうが 正確なのかもしれないが,この授業ではmax-flow/min-cut アルゴリズムを使ってMRF問題を解く方法をグラフカットと 呼ぶことにする • max-flow/min-cutは日本語で最大流・最小カット CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカットの利点 • 大域解(にかなり近い解)が求まる • 隣り合ったピクセルに,滑らかさなどの制約条件を付 ける問題に適している • 計算時間はそこまで遅いわけではない(640x480の2 値グラフカットで1秒くらい?) • 応用範囲が広く,変数が「数値」であっても「カテゴリ」 であっても適用可能 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカットの欠点 • 離散的な値しか表現できない – 例:0,1,2,... 0.1, 0.2, 0.3, ... 領域A, 領域B, 領域C, ... – グラフカットアルゴリズムによっては適用できない変数の列もある 例:0.1, 0.5, -7.1, 3.4, ... • 計算時間はそこまで速いわけではない – リアルタイム処理をするには工夫が必要 – 画像サイズが大きい時の多値グラフカットは計算時間が1時間ぐらい かかることもある • コスト関数の定義によって適したグラフカットアルゴリズムを選 ばないといけない • グラフカットアルゴリズムによっては,多大なメモリ量を要する 場合がある CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカットに頼ればいいわけではない • 与えられたコスト関数を最小化するのがグラフカット の役目 • コスト関数を定義するのはエンジニア自身 • 適切にコスト関数を定義してやらないと,いくらグラフ カットを使ったとしても良い性能はでない • グラフカットアルゴリズムは確立された技術になって きていて,あまり改善の余地はない • コスト関数の改善で大きく性能を向上させることがで きる CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ GCとBP • Graph cut (グラフカット,グラフ切断,グラフ切断法)と Belief propagation (ビリーフプロパゲーション,信念伝 搬法,確率伝搬法,ビリーフ伝搬法,クラスター変分法, ベーテ近似)との違いは? – 計算方法が違う • 適用範囲,計算速度,メモリ量,精度,実装のしやす さ,・・・ – 毎年常に新しいgraph cutや新しいbelief propagationのアルゴ リズムが出てくるので,どちらがいいとは一概に言えない • ほとんど同じってこと? – そもそも目的が同じ:Markov Random Field(マルコフ確率場) の問題の大域解を求めたい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 3 ステレオマッチング,課題はステレオ計算 10/15 [#03] 2眼ステレオマッチング Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ まとめ • 左の画像の画素位置(xl,yl)を固定し,右の画像を探索 – 右の画像は(xl,yl)から始めて通常は左へ画素をずらして探索す る • 左へずらしたピクセル量を視差と呼ぶ • 通常は左へずらした場合に正,右へずらした場合は負 – 左の画像の画素(xr,yr)は通常は(xl,yl)~(xl-DISPMAX,yl)まで 探索する • DISPMAXはユーザが設定する • 例えば,tsukubaのデータは確か最大でも15ピクセルまでの 視差しかなかったはず • Middleburyのデータには(例えば)dmin.txtに(例えば230と) 最大の視差が書かれている – y軸の値を変えて探索する必要はない • あらかじめ前処理で,y軸の値を変えて探索する必要がない ようにしているから→rectification CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ まとめ • (xl,yl)と(xr,yr)を左の画像と右の画像の明るさを比較して,最 もぴったり合う視差を探す – 1ピクセルで明るさを比較すると精度が悪い – 周囲5×5(や3×3や7×7や・・・)ピクセルで比較して精度を向上させる • 差の計算には色々な種類がある – SSDとSADは0以上の値で,値が低いほど合致 – 相関は-1~1の値で,値が高いほど合致 • 通常は前にマイナスを付ける (a) SAD (sum. of absolute difference) I ( x, y) I ( x d , y) l r w I ( x, y) I ( x d , y) 2 (b) SSD (sum. of squared l difference) (c) Correlation r w - CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 4 最大流-最小カット問題,課題はライブラリ を使ってみる 10/22 [#04] 最大流・最小カット問題 Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 最大フロー最小カット定理 • 「最大フローは最小カットの容量に等しい」 • 平たく言えば、ネットワークの最大流量はボトルネックに左右さ れることを意味している。任意の2点間で、一方から他方へ流 れる物量は、その経路内で最も弱い部分によって制限される。 • 右図はノード V = {s,o,p,q,r,t} からなるネットワークであり、始 点 s から 終点 t への総流量は 5 で、これがこのネットワーク の最大である。 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 図1 図2 図3 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 最大流-最小カット定理 • • • • • • • • • • • • • 図1のような容量を持つネットワークがあるとします. sourceをs,sinkをtで表します. sからtへ流すことのできる最大の量はいくらか. 最大流の解は図2になります. これはFord-Fulkersonのアルゴリズムで求めることができます. これを見れば分かる通り,最大で23の量を流すことができます. 図3は最小カットです. s-tカットとは,ノードをsとtに分けるグラフ切断を言います. 切断コストは,その切断のうち,sからtへ流れる量の和です. そのコストが最小となる切断を最小カットと言います. この図では12+7+4でコストは23です. 9は逆向きなのでコストには加算されません. 最小カットの値23は最大流の量と同じです. CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカット • 最小化したいコスト関数を定義する – 問題に応じて,ユーザが適切にコスト関数を定義する • それに対応するグラフを構築する – ユーザがグラフ構造を定義し,API関数でグラフの設定を 行う • 最大流・最小カットアルゴリズムで解く – 既存のライブラリを使う CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカットの例 スムーズ項の重みが小さすぎる場合 スムーズ項の重みが適切な場合 [参考] メディアンを 3回実行した場合 スムーズ項の重みが大きすぎる場合 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする ↑のような画素配置に対して,↓のように1対1にノードを配置 上下に1個ずつ,ソースノードとシンクノードを配置 シンク ソース CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする 隣接画素の影響を考えるなら横方向にもエッジを付ける 今回は隣あった1ピクセル分だけエッジを付ける 双方向に付ける シンク ソース CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする ソース側のエッジの重みに「黒」のデータコスト関数 シンク側のエッジの重みに「白」のデータコスト関数を設定するものとする シンク 白 ↑ ↓ 黒 ソース CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする ユーザがデータコスト関数を定義する 今回は入力画素と同じなら0,違うなら1と定義した 白 ↑ シンク 0 0 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 0 ↓ 黒 ソース CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする ユーザがスムーズコスト関数を定義する 今回は双方向で1と定義した 白 ↑ シンク 0 1 1 ↓ 黒 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 ソース CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする グラフカットのソフトウェアライブラリにこのグラフ構造を設定する この最小カットを解かせる 白 ↑ シンク 0 1 1 ↓ 黒 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 ソース CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする 赤線が今回の場合の解 各ノードはソース側かシンク側のどちらかに属することになる 白 ↑ シンク 0 1 1 ↓ 黒 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 ソース CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする 画素を「切られた側」の色に変化させる 例えば,画素が「ソース側」に属する場合は「シンク側」が切られたので「白」に変化させる 白 ↑ シンク 0 1 1 ↓ 黒 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 ソース CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回の例の場合:簡単のため1次元とする 今回はこれで,ノイズ除去ができる CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカット • • • • • • • • • • • • • • • http://www.cs.adastral.ucl.ac.uk/~vnk/software.ht ml http://www.cs.cornell.edu/~rdz/graphcuts.html http://www.cs.ucl.ac.uk/~vladkolm/software.html http://www.adastral.ucl.ac.uk/~vladkolm/software. html http://www.csd.uwo.ca/faculty/olga/code.html http://vision.middlebury.edu/MRF/code/ http://vision.middlebury.edu/MRF/eccv06/ http://www.caam.rice.edu/~optimization/L1/pgc/ http://www.caam.rice.edu/~wy1/ParaMaxFlow/ http://jerome.berbiqui.org/total-variation-code/ http://avglab.com/andrew/soft.html http://research.microsoft.com/enus/um/people/pkohli/code.html http://maven.smith.edu/~nhowe/research/code/ http://opencv.jp/ http://www.cs.ucl.ac.uk/staff/V.Kolmogorov/softw are.html • 私が使っているライブラ リは上の4つなので,こ の授業はこれをもとに進 める • http://www.cs.ucl.ac.uk /staff/V.Kolmogorov/so ftware.htmlの MAXFLOWというライブ ラリのことである CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ そのライブラリに付いてるサンプルプログラム sink 6 5 3 node0 node1 4 1 2 source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 練習問題 sink 1 4 1 node0 8 1 node1 1 node2 8 1 1 1 node3 1 1 4 4 source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 練習問題のプログラムの例 【メイン関数内にて】 typedef Graph<int,int,int> GraphType; GraphType *g = new GraphType(/*estimated # of nodes*/ 4, /*estimated # of edges*/ 3); g -> add_node(); g -> add_node(); g -> add_node(); g -> add_node(); g -> add_tweights( 0, g -> add_tweights( 1, g -> add_tweights( 2, g -> add_tweights( 3, g -> add_edge( 0, 1, g -> add_edge( 1, 2, g -> add_edge( 2, 3, /* capacities */ /* capacities */ /* capacities */ /* capacities */ /* capacities */ /* capacities */ /* capacities */ 4, 1 ); 1, 4 ); 1, 1 ); 4, 1 ); 1, 1 ); 8, 8 ); 1, 1 ); int flow = g -> maxflow(); printf("Flow = %d\n", flow); printf("Minimum cut:\n"); if (g->what_segment(0) == GraphType::SOURCE) printf("node0 is in the SOURCE set\n"); else printf("node0 is in the SINK set\n"); if (g->what_segment(1) == GraphType::SOURCE) printf("node1 is in the SOURCE set\n"); else printf("node1 is in the SINK set\n"); if (g->what_segment(2) == GraphType::SOURCE) printf("node2 is in the SOURCE set\n"); else printf("node2 is in the SINK set\n"); if (g->what_segment(3) == GraphType::SOURCE) printf("node3 is in the SOURCE set\n"); else printf("node3 is in the SINK set\n"); delete g; CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 2次元画像の場合のグラフ構造の例 sink 2 6 1 4 48 96 6 3 85 29 7 5 1 4 source ただし は 2 を表すものとする 2 赤は予想される最小カットだが, 確かめたわけではないので,ひょっとしたら間違っているかも? CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 5 領域分割,課題は2値グラフカット 10/29 [#05] 2値グラフカットによる領域分 割 Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 領域分割 領域2:背景 領域1:前景 こういう画像を こんなふうに 領域分割したい 単純なしきい値処理 ではうまくいかない CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 領域分割 領域2:背景 領域1:前景 まず,それぞれの領域の色(明るさ)の分布を調べる ユーザが指定したストロークの部分を使うのが普通 この画像の場合,明るさ192付近が領域1,明るさ64付近が領域2 【よって以下のようなデータコストを定義すればよい】 もしそのピクセルの明るさが192に近ければ領域1 もしそのピクセルの明るさが64に近ければ領域2 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 領域分割 領域2:背景 領域1:前景 グラフカットはラベリングのアルゴリズム 領域1をラベル1,領域2をラベル2とする 【データコスト関数】 もしそのピクセルの明るさが192に近ければ領域1 D(1) I 192 もしそのピクセルの明るさが64に近ければ領域2 D(2) I 642 2 しかし,これだけだとしきい値処理と変わらない CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 領域分割 領域2:背景 領域1:前景 周囲に領域1が多ければ,その真ん中の点も領域1の可能性が高い その知見を利用すれば,分割ノイズを取り除けるのではないか? 【よって以下のようなスムーズネスコストを定義すればよい】 もしそのピクセルの周囲に領域1が多ければ領域1 もしそのピクセルの周囲に領域2が多ければ領域2 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 領域分割 領域2:背景 領域1:前景 ある画素は隣り合った4つの画素の影響を受ける,と考える 【スムーズネスコストは隣り合った2つのピクセルの間で定義する】 V (1,1) 0 V (2,2) 0 V (1,2) C V (2,1) C 隣り合った2つの画素のラベルが 同じならペナルティを与えない 隣り合った2つの画素のラベルが 異なるならペナルティを与える Cは0以上の定数 0よりCのほうが大きいので,最小化アルゴリズムを適用すると, なるべく隣り合った2つの画素のラベルが同じになる CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 領域分割 領域2 ↑ シンク D(2,I(q)) D(2,I(p)) C p q D(1,I(q)) D(1,I(p)) ↓ 領域1 ソース ソース側とシンク側のどちらを領域1側,領域2側にするかを決める 各ピクセルをソースとシンクにつなげ,データコストを設定する 隣り合ったピクセル間を双方向につなげ,双方向に同じスムーズコストを設定する 全てのノードとエッジを設定したら,maxflowを計算し,領域分割結果を得る CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ さらなる工夫 LazySnappingとGrabcutの論文や,その他の論文を参考にせよ この授業ではステレオを最終課題としているので, 領域分割はそれほど力を入れなくてもよい 精度は高くなくても,グラフカットによる領域分割が実装できていればそれでよい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 6 α拡張,課題はノイズ除去 11/05 [#06] α拡張によるノイズ除去.休講 にするかどうか未定だがたぶん休講にしな い Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカットによる画像修復 入力画像 真値 メディアン の結果 グラフカット の結果 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今日の授業のポイント 1. 画像修復のためのコスト関数 2. グラフ構造 3. α拡張アルゴリズム 対象はグレースケール画像,0~255の値をとる グラフカットはラベリングのアルゴリズムであるが, 256種類(0~255の値)のラベルを推定する 授業で説明する内容はメモリに無駄がある可能性があるので, 使う画像は小さいサイズのものにしたほうがいい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ コスト関数 D( f p ) f p I p データコスト 出力画像fpが入力画像Ipに出来るだけ近くなるようにする項 スムーズコスト V (a, b) c a b 隣り合った画素の明るさaとbがなるべく近くなるようにする項 cは定数で十分だが,精度を向上させたいなら以下のような値を使ってもいい c c0e d c1 c0とc1は適当な定数 dとして以下を使ってもいいし d I ( p) I (q) 2 dはエッジの強さ ソーベル関数などのもっと良い方法を使ってもよい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフ構造 (スムーズ)コスト関数の定義に応じて 適切なグラフ構造とエッジの重み設定を選ばないといけない 今回の授業では階層グラフカットの実装が最終目的 それに近いグラフ構造が一番右のものなのでこれを使う CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ sink source sink ピクセル間に ノードとエッジを追加 source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ ピクセルの間に余分なノードを付け,それらとの間にエッジを付ける 簡単のようで,プログラミングがややこしい 何番のノードとノードがつながっているか, そのノードは画像の(x,y)座標のどこと対応しているのか x=0 y=0 y=1 x=1 x=2 x=3 画素を表すノードの数は 4×3 (x,y)と(x+1,y)をつなぐノードの数は 3×3 (x,y)と(x,y+1)をつなぐノードの数は 4×2 y=2 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ よくある間違い こういうふうなノードとエッジを作りたい,とする→ A君ははじめに2つのノードを設定して,その間をつなげた その後,ノードを1つ追加して隣の2つとつなげた これは間違いである 間違い 正解 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ 画素pと画素qが隣り合っている ノードaを追加 sink a p a a fp 画素pの現在のラベルをfp 画素qの現在のラベルをfq q fq source Q. ラベルとは? A. 変数.ノイズ除去の場合は, 例えば0~255の256種類の値 Q. 『現在の』ラベルとは? A. 繰り返し計算を行う.反復ループの現時点の状態を表す CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ 画素pではラベルfpとラベルαのどちらかを選ぶような重みをエッジにつける 画素qではラベルfqとラベルαのどちらかを選ぶような重みをエッジにつける sink Q. ラベルαとは? A. 何らかのラベル Q. ラベルとは? A. 変数.ノイズ除去の場合は, 例えば0~255の256種類の値 Q. 『何らかの』ラベルとは? A. あとで説明.α拡張アルゴリズムに基づいて 決められたラベル a p a a fp q fq source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ エッジの重みはこのように付ける 矢印が双方向の場合は両方に同じ値を付ける sink DはデータコストでVはスムーズコスト 今回のノイズ除去では以下のコスト関数を使う データコスト スムーズコスト Dp ( f p ) f p I p V ( f p , fq ) c f p fq Dp (a ) Dq (a ) V (a , a ) a a V ( f p , a ) V (a , f q ) a p fp q V ( f p , fq ) Dp ( f p ) fq Dq ( f q ) source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ データコスト スムーズコスト Dp ( f p ) f p I p V ( f p , fq ) c f p fq 例えば,画素pの明るさIpが128 画素qの明るさIqが60 画素rの明るさIrが80 現在の画素pのラベルfpが192 現在の画素qのラベルfqが75 現在の画素rのラベルfrが70 謎のラベルα(正体はのちほど明かす)が110 c=1 だった場合, Dp ( f p ) 64 Dq ( f q ) 15 V (a , a ) 0 V ( f p ,a ) 82 Dp (a ) 18 V (a , f q ) 35 Dq (a ) 50 V ( f p , f q ) 117 sink Dp (a ) Dq (a ) V (a , a ) a a V ( f p , a ) V (a , f q ) a p fp q V ( f p , fq ) Dp ( f p ) fq Dq ( f q ) source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ この例の場合の最小カットは赤線 Q. 最小カットとは? A. コストが最小となる枝を切る切り方 画素pをラベルαに変更し, 画素qをラベルfqのままにし, 画素rをラベルfrのままにすれば 18 コストがより小さくなる a p sink 30 0 82 apq 117 fp a 50 35 q 15 fq 64 これまでのコスト(fp,fq,fr)=211 修正後のコスト(α,fq,fr)=83 a 0 35 aqr 40 5 10 r fr source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ グラフカットを一回やるたびにコストが小さくなる(ことがある) sink 何度も反復計算を行う でもαがいつも110だったら, 現在のラベル(fp,fq,fr,...)か 110かしか比較されない a p 30 18 0 82 apq 117 fp じゃ,αを0~255まで 毎回変えればいい a 50 35 q 15 fq 64 a 0 35 aqr 40 5 10 r fr source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ α拡張 • • for α=0~255 • 全てのノードとエッジを適切な重みで生成 • 最小カットを行う 収束するまで上記を繰り返す 今までは「領域A」と「領域B」のような2種類のラベルしかできなかった これを2値グラフカットと呼ぶ α拡張アルゴリズムを使えば256種類など,多値グラフカットを扱える Q. 最小カットはどうやって計算すればいいの? A. ソフトウェアライブラリに計算させればいい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ α拡張 • • • • • • 変数の宣言 for p=全てのピクセル • fp=初期値 end for E=とても大きな値 for ループ=0~とても大きな値 • success=0 • for α=0~255 • グラフの初期化 • 全てのノードの追加 • for p=全てのピクセル(例えば640x480) • ノードの,例えば,ソース側にD(fp),シンク側にD(α)を設定 • end for • for (p,q)=全ての隣接点(例えば639x480+640x479) • ノードaの,ソース側にV(fp,fq),シンク側にV(α,α)を設定 • ノードpとノードaのエッジの重み(双方向)にV(fp,α)を設定 • ノードaとノードqのエッジの重み(双方向)にV(α,fq)を設定 • end for • 最大流・最小カットアルゴリズムの適用 • E'=求まったラベルで計算した総コスト関数 • E'<Eなら,現在のラベルを求まったラベルにし,E=E'にし,success=1にする • グラフの消去 • end for • もしsuccess==0ならループを脱出する end for CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 【変数の宣言の例】 typedef Graph<float,float,float> GraphType; GraphType *graph; 【グラフの初期化と消去の例】 graph = new GraphType(ノードの合計数:例えば640x480+639x480+640x479, エッジの合計数:例えば639x480x2+640x479x2); delete graph; 【ノードの追加の例】 graph->add_node(ノードの合計数:例えば640x480+639x480+640x479); CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 【ノードとソース・シンクへの重みの設定の例】 graph->add_tweights( ノード番号, ソースにつながるエッジの重み, シンクにつながるエッジの重み); Q. ノード番号とは? A. ノードを表す数値.プログラマが勝手に番号をつけていい. ただし,ノードをn個追加した場合は,番号は0~n-1に割り振る. Q. ノード番号はどうやって付けたらいいの? A. 自分が最も分かりやすいルールを作ればいい. かなりややこしくて混乱するので,自分にとって分かりやすいほうがいい. デバッグに苦労しないようなナンバリングがいいだろう. 必要であれば,マクロ関数かインライン関数で, 「分かりやすい添え字」を引数として,それに対応するノード番号0~n-1を返す, ようなものを作ってもいい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 【ノードとノードの間のエッジの重みの設定の例】 graph->add_edge(ノード番号i, ノード番号j, ノードiからノードjに向かうエッジの重み, ノードjからノードiに向かうエッジの重み); 今回の場合,エッジは双方向とも同じ値 【最大流・最小カットアルゴリズムの適用の例】 graph -> maxflow(); 【求まったラベルを調べる例】 if(graph->what_segment(ノード番号) == GraphType::SOURCE) その画素はソース側に属する→シンク側のエッジが切られた →シンク側のコストの方が小さい→シンク側のラベルに修正すべきかも if(graph->what_segment(ノード番号) == GraphType::SINK) その画素はシンク側に属する→ソース側のエッジが切られた →ソース側のコストの方が小さい→ソース側のラベルに修正すべきかも Q. ソース側・シンク側のラベルとは? A. それはプログラマがあらかじめ決める.例えば,ソース側をfp,シンク側をα,にする. CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. ラベルとは? A. 求めたい出力を表す変数.プログラマがあらかじめ決める. 今回のノイズ除去では0~255の出力画像の明るさにするといいのでは. Q. 課題はグレースケール画像でいいですか? A. グレースケール画像でいいです. 余裕がある人はRGBカラー画像も実装してみてもいいかも. Q. 初期値はどうすればいいですか? A. 自由に決めてもほぼ問題ない. でも,最終出力結果に近いほうが,ほんのわずかだが良い. 今回はノイズ除去が目的なので,出力画像は入力画像に近いはずなので, 初期値としては入力画像を使うのがいいのでは. 余裕がある人は,試しに初期値を自由に設定してみよう. どんな大きく外れた初期値でも,毎回変わらず良い結果が得られるのが確認できる. (目では確認できないほどの微妙な違いが発生する可能性もある.しかし, ノイズ除去の場合,場合によっては任意の初期値で,毎回全く同じ結果を出す データ・コスト関数も十分ありうる) CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. コスト関数とは? A. それはプログラマがあらかじめ定義する.今回の資料では以下のようなものを想定した Dp ( f p ) f p I p データコスト スムーズコスト V ( f p , fq ) c f p fq Q. 総コストとは? A. 全ての画素でのコストの総和.式で言うと以下の通り fp Ip pP c f p fq ( p ,q )N ただし,Pは全ての画素の集合,Nは全ての隣接関係の集合とする 例えば,今回の場合,画素数が640x480なら, 隣接関係の数は639x480+640x479 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ メモリと計算時間には無駄がある 余裕がある人は論文やライブラリのコメントなどを読んで 無駄を省いてみよう これまで説明した通りに実装するともっと小さい画像じゃないと無理かも? 少なくとも256x256以下じゃないといけないだろう a 今回の場合,V(α,α)=0である. fp=fqの場合,V(fp,fq)=0である. fp=fqの場合,V(fp,α)=V(α,fq)である. a V (a , a ) a V ( f p ,a ) V (a , f q ) V ( f p , a ) V (a , f q ) p fp a a q V ( f p , fq ) fq p fp=fq 【無駄を省く方法】 というよりこれが正しい α拡張の実装方法 q fq=fp CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. どうしても実装できません.もう少し簡単にならないでしょうか? A. どうしてもと言うなら,ほんの少しだけ簡単にできる. 正しいアルゴリズムでは無いが,課題では以下も認める. ちなみに,それでもグラフ構造の部分は簡単にはならない. • • • • • 変数の宣言 for p=全てのピクセル • fp=初期値 end for for ループ=0~2(どうしてもと言うならこのループをはずしてもいい) • for α=0~255 • グラフの初期化 • 全てのノードの追加 • for p=全てのピクセル(例えば640x480) • ノードの,例えば,ソース側にD(fp),シンク側にD(α)を設定 • end for • for (p,q)=全ての隣接点(例えば639x480+640x479) • ノードaの,ソース側にV(fp,fq),シンク側にV(α,α)を設定 • ノードpとノードaのエッジの重み(双方向)にV(fp,α)を設定 • ノードaとノードqのエッジの重み(双方向)にV(α,fq)を設定 • end for • 最大流・最小カットアルゴリズムの適用 • 現在のラベルを求まったラベルにする • グラフの消去 • end for CG Lab, Hiroshima City University end for http://www.hiroshima-cu.ac.jp/ Q. このグラフの作り方ではsemimetricなスムーズ関数しか使うことができません. regularであれば適用できるグラフの作り方がありますが,そっちのほうがいいのでは? A. この授業ではそのグラフの作り方は扱いません. Q. QPBO, roof-dualityのほうがいいのでは? A. この授業では扱いません. Q. もっと速いグラフカットを使ったほうがいいのでは? A. この授業では後半で,Miyazakiらの階層グラフカットを紹介します. CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 7 α拡張でステレオ,課題も同じ 11/12 [#07] α拡張によるステレオマッチン グ Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ まとめ • 左の画像の画素位置(xl,yl)を固定し,右の画像を探索 – 右の画像は(xl,yl)から始めて通常は左へ画素をずらして探索す る • 左へずらしたピクセル量を視差と呼ぶ • 通常は左へずらした場合に正,右へずらした場合は負 – 左の画像の画素(xr,yr)は通常は(xl,yl)~(xl-DISPMAX,yl)まで 探索する • DISPMAXはユーザが設定する • 例えば,tsukubaのデータは確か最大でも15ピクセルまでの 視差しかなかったはず • Middleburyのデータには(例えば)dmin.txtに(例えば230と) 最大の視差が書かれている – y軸の値を変えて探索する必要はない • あらかじめ前処理で,y軸の値を変えて探索する必要がない ようにしているから→rectification CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ まとめ • (xl,yl)と(xr,yr)を左の画像と右の画像の明るさを比較して,最 もぴったり合う視差を探す – 1ピクセルで明るさを比較すると精度が悪い – 周囲5×5(や3×3や7×7や・・・)ピクセルで比較して精度を向上させる • 差の計算には色々な種類がある – SSDとSADは0以上の値で,値が低いほど合致 – 相関は-1~1の値で,値が高いほど合致 • 通常は前にマイナスを付ける (a) SAD (sum. of absolute difference) I ( x, y) I ( x d , y) l r w I ( x, y) I ( x d , y) 2 (b) SSD (sum. of squared l difference) (c) Correlation r w - CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今日の授業のポイント 1. ステレオマッチングのためのコスト関数 2. グラフ構造 3. α拡張アルゴリズム 対象は2枚の画像,視差(disparity)0~DISPMAXの値をとる DISPMAXはユーザが設定する グラフカットはラベリングのアルゴリズムであるが, 0~DISPMAXのラベルを推定する 授業で説明する内容はメモリに無駄がある可能性があるので, 使う画像は小さいサイズのものにしたほうがいい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ コスト関数 データコスト D ( f x , y ) I l ( x, y ) I r ( x f x , y , y ) Wx , y SADを使った場合 マッチングコスト スムーズコスト V ( f p , fq ) c f p fq 隣り合った画素の視差fpとfqがなるべく近くなるようにする項 つまり形状(奥行き)が滑らかに変化する cは定数で十分だが,別の選択肢として以下のような値を使ってもいい c0 c c1 if d T c0とc1は適当な定数 dとして以下を使ってもいいし Tは適当なしきい値 d I l ( p) I l (q) if d T dはエッジの強さ ソーベル関数などのもっと良い方法を使ってもよい なんでこれでうまくいくのか考えてみよう 最終課題では上のデータコストやスムーズコストを変えてみよう 様々な論文などを調査し,精度を向上させてみよう CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ sink source sink ピクセル間に ノードとエッジを追加 source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ ピクセルの間に余分なノードを付け,それらとの間にエッジを付ける 簡単のようで,プログラミングがややこしい 何番のノードとノードがつながっているか, そのノードは画像の(x,y)座標のどこと対応しているのか x=0 y=0 y=1 x=1 x=2 x=3 画素を表すノードの数は 4×3 (x,y)と(x+1,y)をつなぐノードの数は 3×3 (x,y)と(x,y+1)をつなぐノードの数は 4×2 y=2 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ 画素pと画素qが隣り合っている ノードaを追加 sink a p a a fp 画素pの現在のラベルをfp 画素qの現在のラベルをfq q fq source Q. ラベルとは? A. 変数.ステレオの場合は, 例えば0~DISPMAXの値 Q. 『現在の』ラベルとは? A. 繰り返し計算を行う.反復ループの現時点の状態を表す CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ 画素pではラベルfpとラベルαのどちらかを選ぶような重みをエッジにつける 画素qではラベルfqとラベルαのどちらかを選ぶような重みをエッジにつける sink Q. ラベルαとは? A. 何らかのラベル a Q. 『何らかの』ラベルとは? A. あとで説明.α拡張アルゴリズムに基づいて 決められたラベル p a a fp q fq source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ エッジの重みはこのように付ける 矢印が双方向の場合は両方に同じ値を付ける sink DはデータコストでVはスムーズコスト Dp (a ) Dq (a ) V (a , a ) a a V ( f p , a ) V (a , f q ) a p fp q V ( f p , fq ) Dp ( f p ) fq Dq ( f q ) source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ α拡張 • • • • • • 変数の宣言 for p=全てのピクセル • fp=初期値 end for E=とても大きな値 for ループ=0~とても大きな値 • success=0 • for α=0~DISPMAX • グラフの初期化 • 全てのノードの追加 • for p=全てのピクセル(例えば640x480) • ノードの,例えば,ソース側にD(fp),シンク側にD(α)を設定 • end for • for (p,q)=全ての隣接点(例えば639x480+640x479) • ノードaの,ソース側にV(fp,fq),シンク側にV(α,α)を設定 • ノードpとノードaのエッジの重み(双方向)にV(fp,α)を設定 • ノードaとノードqのエッジの重み(双方向)にV(α,fq)を設定 • end for • 最大流・最小カットアルゴリズムの適用 • E'=求まったラベルで計算した総コスト関数 • E'<Eなら,現在のラベルを求まったラベルにし,E=E'にし,success=1にする • グラフの消去 • end for • もしsuccess==0ならループを脱出する end for CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. 初期値はどうすればいいですか? A. 自由に決めてもほぼ問題ない. でも,最終出力結果に近いほうが,ほんのわずかだが良い. 今回はステレオマッチングが目的なので,初期値としては, 以前の課題でやったブロックマッチングによるステレオの結果を使うのがいいのでは. 初期値を設定するのが面倒な人は全て視差ゼロでOK. 今回は課題がないが, 最終課題はステレオなので, 余裕がある人は今日の内容を実装しておくと後々ラクになる CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 8 階層グラフカット,課題はノイズ除去 11/19 [#08] 階層グラフカットによるノイズ 除去 Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ α拡張と階層グラフカット • α拡張 • for α=0~63 • 全てのノードとエッジを適切な重みで生成 • 最小カットを行う 収束するまで上記を繰り返す 3~16倍 速い • 階層グラフカット • for i=0~11 • αを適切に設定 • 全てのノードとエッジを適切な重みで生成 • 最小カットを行う 収束するまで上記を繰り返す http://www.cg.info.hiroshima-cu.ac.jp/~miyazaki/publication/project/shadow/indexe.html CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Approach based on alpha expansion Alpha expansion 1 5 Hierarchical graph cut 1 5 3 3 1 5 1 5 1 5 2 alpha=2 3 1 2 1 5 2 4 3 1 5 2 alpha=4 4 2 1 alpha=2,4,... 4 5 3 4 5 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Hierarchical structure 20 32 16 16 48 24 40 48 8 16 24 32 40 48 56 16 8 32 32 48 56 8 16 24 32 40 48 56 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Graph construction example a D(a p ) D(aq ) V (a p ,aq ) D(b p ) D(aq ) V (b p , bq ) max 0,V (b p ,aq ) V (b p , bq ) p a q D(a p ) D(bq ) V (b p , bq ) max 0,V (a p , bq ) V (b p , bq ) D(b p ) D(bq ) V (b p , bq ) b CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Algorithm Alpha expansion 1. A = {0, 1, 2, ..., 63} 2. for i = 0 to 63 do a. for all nodes&edges do I. a A[i] II. add nodes&edges using a & b p b. solve max-flow/min-cut problem 3. Iterate 2 until convergence Hierarchical graph cut 1. A = {{0}, {32}, {16}, {48}, {8, 40}, {24, 56}, {4, 20, 36, 52}, {12, 28, 44, 60}, ..., {3, 7, 11, ..., 63}} 2. for i = 0 to 11 do a. for all nodes&edges do I. a p arg min aA[i ] b p a II. add nodes&edges usinga p & b p b. solve max-flow/min-cut problem 3. Iterate 2 until convergence CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 0~63のラベルの場合(n=64) A = {{0}, {32}, {16}, {48}, {8, 40}, {24, 56}, {4, 20, 36, 52}, {12, 28, 44, 60}, {2, 10, 18, 26, 34, 42, 50, 58}, {6, 14, 22, 30, 38, 46, 54, 62}, {1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 56, 60}, {3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63}} あらかじめ自分で計算しておいてもいいが,できればプログラムで自動的に計算させよう ラベルの数は2の累乗じゃなければいけない 全てのラベル(この場合は0~63)が使われるか検算しよう 各階層でラベルが等間隔で,下の階層にいくに従って間隔が半分になるか確かめよう CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Output of Hierarchical graph cut Stereo matching [Art] Stereo matching [Laundry] Image restoration Shadow removal Input Ground truth Ishikawa 2003 a expansion Hierarchical cut CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Speed of hierarchical graph cut Stereo matching [Art] Stereo matching [Laundry] Image restoration Shadow removal Speed-up 6.8 11.4 16.6 3.4 Error difference +4.6% +3.0% -0.4% +0.0% Hierarchical graph cut Alpha expansion 1.1107 1.7106 Energy 0 Energy [sec] 250 1.5106 Iteration 7 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ グラフカットによる画像修復 入力画像 真値 メディアン の結果 グラフカット の結果 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今日の授業のポイント 1. 画像修復のためのコスト関数 2. グラフ構造 3. 階層グラフカット 対象はグレースケール画像,0~255の値をとる グラフカットはラベリングのアルゴリズムであるが, 256種類(0~255の値)のラベルを推定する 授業で説明する内容はメモリに無駄がある可能性があるので, 使う画像は小さいサイズのものにしたほうがいい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ コスト関数 D ( p ) p I p データコスト 出力画像γpが入力画像Ipに出来るだけ近くなるようにする項 スムーズコスト V ( p , q ) c p q 隣り合った画素の明るさγpとγpqがなるべく近くなるようにする項 cは定数で十分だが,精度を向上させたいなら以下のような値を使ってもいい c c0e d c1 c0とc1は適当な定数 dとして以下を使ってもいいし d I p I q 2 dはエッジの強さ ソーベル関数などのもっと良い方法を使ってもよい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ sink source sink ピクセル間に ノードとエッジを追加 source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ ピクセルの間に余分なノードを付け,それらとの間にエッジを付ける 簡単のようで,プログラミングがややこしい 何番のノードとノードがつながっているか, そのノードは画像の(x,y)座標のどこと対応しているのか x=0 y=0 y=1 x=1 x=2 x=3 画素を表すノードの数は 4×3 (x,y)と(x+1,y)をつなぐノードの数は 3×3 (x,y)と(x,y+1)をつなぐノードの数は 4×2 y=2 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ 画素pと画素qが隣り合っている ノードaを追加 sink ap p aq a βp 画素pの現在のラベルをβp 画素qの現在のラベルをβq q βq source Q. ラベルとは? A. 変数.ノイズ除去の場合は, 例えば0~255の256種類の値 Q. 『現在の』ラベルとは? A. 繰り返し計算を行う.反復ループの現時点の状態を表す CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ 画素pではラベルβpとラベルαpのどちらかを選ぶような重みをエッジにつける 画素qではラベルβqとラベルαqのどちらかを選ぶような重みをエッジにつける sink Q. ラベルαとは? A. 何らかのラベル Q. ラベルとは? A. 変数.ノイズ除去の場合は, 例えば0~255の256種類の値 Q. 『何らかの』ラベルとは? A. あとで説明.階層グラフカットアルゴリズム に基づいて決められたラベル ap p aq a βp q βq source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ エッジの重みはこのように付ける sink DはデータコストでVはスムーズコスト eの設定の仕方は場合によって 次のスライドとその次のスライドの2種類 Dp (a p ) ap V (a p , a q ) e pa Dq (aq ) eaq a p βp eap eqa V (b p , bq ) aq q βq Dq (bq ) Dp (b p ) source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ V (b p , bq ) V (a p ,aq ) の場合 Q. max(a,b)とは? A. aかbのうちどちらか 大きいほうを返す関数 sink max0,V (a p , bq ) V (b p , bq ) e pa p eaq a eap eqa q max0,V (b p ,aq ) V (b p , bq ) source Q. ∞の重みとは? A. 実装上は大きな値(例えば1万)を設定 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ V (b p , bq ) V (a p ,aq ) の場合 Q. max(a,b)とは? A. aかbのうちどちらか 大きいほうを返す関数 sink max0,V (a p , bq ) V (a p ,aq ) e pa p eaq a eap q eqa max0,V (b p ,aq ) V (a p ,aq ) source Q. ∞の重みとは? A. 実装上は大きな値(例えば1万)を設定 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ • • • • • • • 変数の宣言 for p=全てのピクセル • βp=初期値 end for A={{0},...,{3,...,63}} E=とても大きな値 for ループ=0~とても大きな値 • success=0 • for i=0~11 • グラフの初期化 • 全てのノードの追加 • for p=全てのピクセル(例えば640x480) • A[i]のうち,βpに最も近い値をαpに設定 • ノードの,ソース側にD(βp),シンク側にD(αp)を設定 • end for • for (p,q)=全ての隣接点(例えば639x480+640x479) • A[i]のうち,βpに最も近い値をαpに設定 • A[i]のうち,βqに最も近い値をαqに設定 • ノードaの,ソース側にV(βp,βq),シンク側にV(αp,αq)を設定 • もし,V(βp,βq)≦V(αp,αq)の場合 • ノードaからノードpへのエッジの重みに10000を設定 • ノードaからノードqへのエッジの重みに10000を設定 • ノードpからノードaへのエッジの重みに,V(αp,βq)-V(βp,βq)か0のうち大きいほうを設定 • ノードqからノードaへのエッジの重みに,V(βp,αq)-V(βp,βq)か0のうち大きいほうを設定 • もし,V(βp,βq)≧V(αp,αq)の場合 • ノードpからノードqへのエッジの重みに10000を設定 • ノードqからノードaへのエッジの重みに10000を設定 • ノードaからノードqへのエッジの重みに,V(αp,βq)-V(αp,αq)か0のうち大きいほうを設定 • ノードaからノードpへのエッジの重みに,V(βp,αq)-V(αp,αq)か0のうち大きいほうを設定 • end for • 最大流・最小カットアルゴリズムの適用 • E'=求まったラベルで計算した総コスト関数 • E'<Eなら,現在のラベルを求まったラベルにし,E=E'にし,success=1にする • グラフの消去 • end for • もしsuccess==0ならループを脱出する end for CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. αってどうやって選ぶの? A. あるループiにおいて,A[i]のうちβ(現在のラベル)に最も近いものを選ぶ ラベル数64の場合,各A[i]の個数は, |A[0]|=1, |A[1]|=1, |A[2]|=1, |A[3]|=1, |A[4]|=2, |A[5]|=2, |A[6]|=4, |A[7]|=4, |A[8]|=8, |A[9]|=8, |A[10]|=16, |A[11]|=16 ちなみに,これらを合計すると64になる (ここでは| |は個数を表す) 例:A[6]={4,20,36,52}の場合で 現在のラベルβpが13だったら αpとしては20を選ぶ 2i 1 一般的には Ai max1,2 ただし,|_ _|は小数点以下切り捨てを表す CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. ラベルとは? A. 求めたい出力を表す変数.プログラマがあらかじめ決める. 今回のノイズ除去では0~255の出力画像の明るさにするといいのでは. Q. 課題はグレースケール画像でいいですか? A. グレースケール画像でいいです. 余裕がある人はRGBカラー画像も実装してみてもいいかも. Q. 初期値はどうすればいいですか? A. 自由に決めてもほぼ問題ない. でも,最終出力結果に近いほうが,ほんのわずかだが良い. 今回はノイズ除去が目的なので,出力画像は入力画像に近いはずなので, 初期値としては入力画像を使うのがいいのでは. 余裕がある人は,試しに初期値を自由に設定してみよう. どんな大きく外れた初期値でも,毎回変わらず良い結果が得られるのが確認できる. (目では確認できないほどの微妙な違いが発生する可能性もある.しかし, ノイズ除去の場合,場合によっては任意の初期値で,毎回全く同じ結果を出す データ・コスト関数も十分ありうる) CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ メモリと計算時間には無駄がある 余裕がある人は論文やライブラリのコメントなどを読んで 無駄を省いてみよう これまで説明した通りに実装するともっと小さい画像じゃないと無理かも? 少なくとも256x256以下じゃないといけないだろう αp=αqかつβp=βqの場合 【無駄を省く方法】 a ap p βp aq a V (a , b ) q βq p β a q β CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. どうしても実装できません.もう少し簡単にならないでしょうか? A. どうしてもと言うなら,ほんの少しだけ簡単にできる. 正しいアルゴリズムでは無いが,課題では以下も認める. ちなみに,それでもグラフ構造の部分は簡単にはならない. • • • (元のアルゴリズムと同じ処理) for ループ=0~2(どうしてもと言うならこのループをはずしてもいい) • for i=0~11 • (元のアルゴリズムと同じ処理) • 最大流・最小カットアルゴリズムの適用 • 現在のラベルを求まったラベルにする • グラフの消去 • end for end for CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今回「階層グラフカットでノイズ除去」は課題を出さない 前回の課題「α拡張でノイズ除去」の理解の助けにはなるかも 最終課題「階層グラフカットでステレオ」に役立つかもしれないので, 余裕のある人は今回の内容も実装してみるといいだろう CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 9 階層グラフカットでステレオ,課題も同じ 11/26 [#09] 階層グラフカットによるステレ オマッチング Computer Graphics Laboratory, Hiroshima City University http://www.hiroshima-cu.ac.jp/ まとめ • 左の画像の画素位置(xl,yl)を固定し,右の画像を探索 – 右の画像は(xl,yl)から始めて通常は左へ画素をずらして探索す る • 左へずらしたピクセル量を視差と呼ぶ • 通常は左へずらした場合に正,右へずらした場合は負 – 左の画像の画素(xr,yr)は通常は(xl,yl)~(xl-DISPMAX,yl)まで 探索する • DISPMAXはユーザが設定する • 例えば,tsukubaのデータは確か最大でも15ピクセルまでの 視差しかなかったはず • Middleburyのデータには(例えば)dmin.txtに(例えば230と) 最大の視差が書かれている – y軸の値を変えて探索する必要はない • あらかじめ前処理で,y軸の値を変えて探索する必要がない ようにしているから→rectification CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ まとめ • (xl,yl)と(xr,yr)を左の画像と右の画像の明るさを比較して,最 もぴったり合う視差を探す – 1ピクセルで明るさを比較すると精度が悪い – 周囲5×5(や3×3や7×7や・・・)ピクセルで比較して精度を向上させる • 差の計算には色々な種類がある – SSDとSADは0以上の値で,値が低いほど合致 – 相関は-1~1の値で,値が高いほど合致 • 通常は前にマイナスを付ける (a) SAD (sum. of absolute difference) I ( x, y) I ( x d , y) l r w I ( x, y) I ( x d , y) 2 (b) SSD (sum. of squared l difference) (c) Correlation r w - CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Output of Hierarchical graph cut Stereo matching [Art] Stereo matching [Laundry] Image restoration Shadow removal Input Ground truth Ishikawa 2003 a expansion Hierarchical cut CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 今日の授業のポイント 1. ステレオマッチングのためのコスト関数 2. グラフ構造 3. 階層グラフカット 対象は2枚の画像,視差(disparity)0~DISPMAXの値をとる DISPMAXはユーザが設定する グラフカットはラベリングのアルゴリズムであるが, 0~DISPMAXのラベルを推定する 授業で説明する内容はメモリに無駄がある可能性があるので, 使う画像は小さいサイズのものにしたほうがいい CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ コスト関数 データコスト D ( f x , y ) I l ( x, y ) I r ( x f x , y , y ) Wx , y SADを使った場合 マッチングコスト スムーズコスト V ( f p , fq ) c f p fq 隣り合った画素の視差fpとfqがなるべく近くなるようにする項 つまり形状(奥行き)が滑らかに変化する cは定数で十分だが,別の選択肢として以下のような値を使ってもいい c0 c c1 if d T c0とc1は適当な定数 dとして以下を使ってもいいし Tは適当なしきい値 d I l ( p) I l (q) if d T dはエッジの強さ c0≦c1 ソーベル関数などのもっと良い方法を使ってもよい なんでこれでうまくいくのか考えてみよう 最終課題では上のデータコストやスムーズコストを変えてみよう 様々な論文などを調査し,精度を向上させてみよう CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ sink source sink ピクセル間に ノードとエッジを追加 source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ ピクセルの間に余分なノードを付け,それらとの間にエッジを付ける 簡単のようで,プログラミングがややこしい 何番のノードとノードがつながっているか, そのノードは画像の(x,y)座標のどこと対応しているのか x=0 y=0 y=1 x=1 x=2 x=3 画素を表すノードの数は 4×3 (x,y)と(x+1,y)をつなぐノードの数は 3×3 (x,y)と(x,y+1)をつなぐノードの数は 4×2 y=2 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ 画素pと画素qが隣り合っている ノードaを追加 sink ap p aq a βp 画素pの現在のラベルをβp 画素qの現在のラベルをβq q βq source Q. ラベルとは? A. 変数.ステレオの場合は, 例えば0~DISPMAXの値 Q. 『現在の』ラベルとは? A. 繰り返し計算を行う.反復ループの現時点の状態を表す CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ 画素pではラベルβpとラベルαpのどちらかを選ぶような重みをエッジにつける 画素qではラベルβqとラベルαqのどちらかを選ぶような重みをエッジにつける sink Q. ラベルαとは? A. 何らかのラベル ap Q. 『何らかの』ラベルとは? A. あとで説明.階層グラフカットアルゴリズム に基づいて決められたラベル p aq a βp q βq source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ エッジの重みはこのように付ける sink DはデータコストでVはスムーズコスト eの設定の仕方は場合によって 次のスライドとその次のスライドの2種類 Dp (a p ) ap V (a p , a q ) e pa Dq (aq ) eaq a p βp eap eqa V (b p , bq ) aq q βq Dq (bq ) Dp (b p ) source CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ V (b p , bq ) V (a p ,aq ) の場合 Q. max(a,b)とは? A. aかbのうちどちらか 大きいほうを返す関数 sink max0,V (a p , bq ) V (b p , bq ) e pa p eaq a eap eqa q max0,V (b p ,aq ) V (b p , bq ) source Q. ∞の重みとは? A. 実装上は大きな値(例えば1万)を設定 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ ノードとエッジ V (b p , bq ) V (a p ,aq ) の場合 Q. max(a,b)とは? A. aかbのうちどちらか 大きいほうを返す関数 sink max0,V (a p , bq ) V (a p ,aq ) e pa p eaq a eap q eqa max0,V (b p ,aq ) V (a p ,aq ) source Q. ∞の重みとは? A. 実装上は大きな値(例えば1万)を設定 CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Algorithm Alpha expansion 1. A = {0, 1, 2, ..., 63} 2. for i = 0 to 63 do a. for all nodes&edges do I. a A[i] II. add nodes&edges using a & b p b. solve max-flow/min-cut problem 3. Iterate 2 until convergence Hierarchical graph cut 1. A = {{0}, {32}, {16}, {48}, {8, 40}, {24, 56}, {4, 20, 36, 52}, {12, 28, 44, 60}, ..., {3, 7, 11, ..., 63}} 2. for i = 0 to 11 do a. for all nodes&edges do I. a p arg min aA[i ] b p a II. add nodes&edges usinga p & b p b. solve max-flow/min-cut problem 3. Iterate 2 until convergence CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ • • • • • • • 変数の宣言 for p=全てのピクセル • βp=初期値 end for A={{0},...,{3,...,63}} E=とても大きな値 for ループ=0~とても大きな値 • success=0 • for i=0~11 • グラフの初期化 • 全てのノードの追加 • for p=全てのピクセル(例えば640x480) • A[i]のうち,βpに最も近い値をαpに設定 • ノードの,ソース側にD(βp),シンク側にD(αp)を設定 • end for • for (p,q)=全ての隣接点(例えば639x480+640x479) • A[i]のうち,βpに最も近い値をαpに設定 • A[i]のうち,βqに最も近い値をαqに設定 • ノードaの,ソース側にV(βp,βq),シンク側にV(αp,αq)を設定 • もし,V(βp,βq)≦V(αp,αq)の場合 • ノードaからノードpへのエッジの重みに10000を設定 • ノードaからノードqへのエッジの重みに10000を設定 • ノードpからノードaへのエッジの重みに,V(αp,βq)-V(βp,βq)か0のうち大きいほうを設定 • ノードqからノードaへのエッジの重みに,V(βp,αq)-V(βp,βq)か0のうち大きいほうを設定 • もし,V(βp,βq)≧V(αp,αq)の場合 • ノードpからノードqへのエッジの重みに10000を設定 • ノードqからノードaへのエッジの重みに10000を設定 • ノードaからノードqへのエッジの重みに,V(αp,βq)-V(αp,αq)か0のうち大きいほうを設定 • ノードaからノードpへのエッジの重みに,V(βp,αq)-V(αp,αq)か0のうち大きいほうを設定 • end for • 最大流・最小カットアルゴリズムの適用 • E'=求まったラベルで計算した総コスト関数 • E'<Eなら,現在のラベルを求まったラベルにし,E=E'にし,success=1にする • グラフの消去 • end for • もしsuccess==0ならループを脱出する end for CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ 0~63のラベルの場合(n=64) A = {{0}, {32}, {16}, {48}, {8, 40}, {24, 56}, {4, 20, 36, 52}, {12, 28, 44, 60}, {2, 10, 18, 26, 34, 42, 50, 58}, {6, 14, 22, 30, 38, 46, 54, 62}, {1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 56, 60}, {3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63}} あらかじめ自分で計算しておいてもいいが,できればプログラムで自動的に計算させよう ラベルの数は2の累乗じゃなければいけない 全てのラベル(この場合は0~63)が使われるか検算しよう 各階層でラベルが等間隔で,下の階層にいくに従って間隔が半分になるか確かめよう CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. αってどうやって選ぶの? A. あるループiにおいて,A[i]のうちβ(現在のラベル)に最も近いものを選ぶ ラベル数64の場合,各A[i]の個数は, |A[0]|=1, |A[1]|=1, |A[2]|=1, |A[3]|=1, |A[4]|=2, |A[5]|=2, |A[6]|=4, |A[7]|=4, |A[8]|=8, |A[9]|=8, |A[10]|=16, |A[11]|=16 ちなみに,これらを合計すると64になる (ここでは| |は個数を表す) 例:A[6]={4,20,36,52}の場合で 現在のラベルβpが13だったら αpとしては20を選ぶ 2i 1 一般的には Ai max1,2 ただし,|_ _|は小数点以下切り捨てを表す CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. 初期値はどうすればいいですか? A. 自由に決めてもほぼ問題ない. でも,最終出力結果に近いほうが,ほんのわずかだが良い. 今回はステレオマッチングが目的なので,初期値としては, 以前の課題でやったブロックマッチングによるステレオの結果を使うのがいいのでは. 初期値を設定するのが面倒な人は全て視差ゼロでOK. 最終課題は精度も競って欲しいので, 良い初期値を与えて欲しい ただし,計算速度も競って欲しいので, 初期値を計算しないほうがいいという作戦もありえる CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ メモリと計算時間には無駄がある 余裕がある人は論文やライブラリのコメントなどを読んで 無駄を省いてみよう これまで説明した通りに実装するともっと小さい画像じゃないと無理かも? 少なくとも256x256以下じゃないといけないだろう αp=αqかつβp=βqの場合 【無駄を省く方法】 a ap p βp aq a V (a , b ) q βq p β a q β CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/ Q. どうしても実装できません.もう少し簡単にならないでしょうか? A. どうしてもと言うなら,ほんの少しだけ簡単にできる. 正しいアルゴリズムでは無いが,課題では以下も認める. ちなみに,それでもグラフ構造の部分は簡単にはならない. • • • (元のアルゴリズムと同じ処理) for ループ=0~2(どうしてもと言うならこのループをはずしてもいい) • for i=0~11 • (元のアルゴリズムと同じ処理) • 最大流・最小カットアルゴリズムの適用 • 現在のラベルを求まったラベルにする • グラフの消去 • end for end for CG Lab, Hiroshima City University http://www.hiroshima-cu.ac.jp/
© Copyright 2025 ExpyDoc