さまざまな素材の画像セグメンテーションの問題


15

こんにちはCV /パターン認識コミュニティ、

画像のセグメンテーションに関して深刻な問題があります。シナリオは、私の頭を狂わせる炉内の雰囲気です。また、1つの特殊なケースだけでなく、さまざまな材料(ガラス、セラミック、Al、Irなど)のオブジェクトの輪郭を短時間(10秒未満)で検出する必要があります。また、コードのピクセルの連続した行に輪郭が必要です。したがって、チェーンコードまたはいわゆるボーダー/輪郭追跡も必要であるため、オープンホールは適切ではありません。バックグラウンドには、ほこり、粒子などの非線形ノイズが時々現れます。

MatlabまたはOpenCVの提案を歓迎します。

より明確にするために、目標と半透明のオブジェクトの別の画像を投稿しましたが、これも検出する必要があります。また、知っておく必要があるさらなる例。 例1 例2 例3 例4

画像#1を見るとわかるように、画像の右側の部分と、オブジェクトである星の外側の輪郭の近くに粒子があります。また、全体的なコントラストはあまり良くありません。オブジェクト自体は地下にあり、輪郭検出には関係ありません。画像#2は半透明のオブジェクトを示していますが、これも可能です。

次の画面(赤い線)のように、そのオブジェクトの輪郭/境界を見つけたい。2つの長方形(黄色)は、開始点(左)と終了点(右)を示しています。青い線は無視できます。 例2

最初は、フィルターだけでその不潔な雰囲気の問題を解決できると思いました。しかし、多大な時間を費やした後、前景と背景のコントラストを高めるためにノイズを大幅に除去または削減する必要があることに気付きました。ヒストグラム等化、大津適応等化、線形フィルター(ガウスなど)、非線形フィルター(中央値、拡散)、Active Contours、k-Means、Fuzzy-c-means、純粋なCannyなど、多くの方法を試しました。形態学的演算子と組み合わせたエッジ検出。

  • キャニー:粒子と大気が穴の原因になっていますが、オブジェクトの完全な輪郭が必要です。モルフォロジー演算子を閉じて拡張しても、それだけでは十分ではありません。Cannyには、ヒステリシスがあるため、私が研究したすべての方法の中で最高の結果が残っています。
  • アクティブな輪郭:エッジ/グラデーションでも機能します。オブジェクト内で初期化した後、完全に狂ったように動作します。これは、エッジマップが「開いた」オブジェクトになっていることが原因である可能性があります。私の知る限り、輪郭を閉じなければなりません。さまざまな派生物(GVF / VFC / Classic Snake)で試してみました。
  • k-Means:霧の背景のため、結果には炉の雰囲気が含まれます。ファジーc-meansについても同じです。オブジェクトを背景から分離するため、2つのクラスターを選択しました。クラスターが多いと、結果が弱くなります。
  • ヒストグラム/大津:グレーの強度が非常に近いため(imho!)、オブジェクトと背景をマージしています。ローカルおよびグローバルな方法で試してみました。
  • フィルター:特にGLPFまたは他のLPFがエッジを塗りつぶしますが、これはあまり良くなく、霧の雰囲気さえも低減しません。
  • 非線形フィルターはエッジを保持しています。それらのほとんどは、大きな画像の計算に時間がかかりすぎます。とりあえず、高速の双方向フィルタを使用しました。結果は以下を参照してください。

したがって、得られたオブジェクトセグメントの結果は既存のアルゴリズムと十分に競合しないため、後処理ステップには単一の方法では十分ではありません。既存のアルゴリズムは非常にローカルであるため、この非常に特殊なシナリオで機能します。

何かを完全に見逃してしまった場合、どうすればいいかわかりません。隙間や穴を開けずに、どのように処理し、どのように良好な輪郭結果を得る必要があるのか​​分かりません。 CCDと物理的環境?前もって感謝します!

これまでの最後のアプローチ(MOでの長い実験の後):

  • バイラテラルフィルター(エッジを保持しますが、均一な領域を平滑化します)
  • キャニー(シグマ= 2、しきい値= [0.04 0.08])
  • 形態学的オペレーション(MO): 、 bwareopen、&closingremovebridge
  • bwlabel輪郭の周囲のみを選択し、不要なノイズを除去します。まだスクリーンショットは更新されていませんが、スターには有効です。ガラスには外側の輪郭に接続された内側の輪郭があります。これは下のスクリーンショットでも確認できます。

そのため、外側の輪郭を横断するための特別なアルゴリズムが必要なのではないかと心配しています。近隣の時計回り/反時計回りの検索になります。コーナーポイントがある場合、その時計回り/反時計回りのステップを切り替えることができます。隙間がある場合は、半径を増やしてもう一度見てください。次のポイントが2つ以上ある場合は、前と同じ方向を向いたポイントを選択します。その輪郭追従アルゴリズムは理にかなっていると思いますか?

ガラスの端 星


適応しきい値を試しましたか?あなたはそれに言及していないようです。OTSUは、ノイズを除去した後、何らかの形で機能するはずですが、おそらく適応しきい値が優れていると思います。
ルイマーキーズ

こんにちはRui、このMatlab拡張機能を使用して適応型しきい値処理を試しました:適応型しきい値処理ウィンドウパラメーターを試してみ た結果は次のとおりです。1番目の試行2番目の試行 3番目の試行良いですが、背景の残りの部分も黒に変わりますが、それは悪いことです。
mchlfchr

3
基本的な画像縮小技術をいくつか試しましたか?右上の暗くなる部分を取り除くためにフラットフィールド補正を差し引くなど(en.wikipedia.org/wiki/Flat-field_correction)。また、粒子が静的である場合、それらは即座に除去されます。その後、あなたは...あなたがしたい任意のエッジ検出方法を使用することができます
PhilMacKay

こんにちはフィル、私が知る限り、私が知っている限り、物体が炉に入る前に撮影された一連の写真があります。したがって、キャリブレーションの種類はここにあります。月曜日にCCDと環境を担当する物理学者と話をします。しかし、アドバイスのおかげで、私はそれを試してみます!
mchlfchr

追加した2番目の画像はまったく異なって見えます。可能なすべての画像を投稿できますか?
アンドレイRubshtein

回答:


2

以下を試すことができます:

  • 効率的なグラフベースの画像セグメンテーション:http : //www.cs.brown.edu/~pff/segment/(利用可能なコード)

  • GraphCutベースのセグメンテーション:http ://www.csd.uwo.ca/~olga/OldCode.html (使用可能なコード)

  • スパースメソッドを使用して最初に画像のノイズを除去します:http ://spams-devel.gforge.inria.fr/ (利用可能なコード)


こんにちは、スパースメソッドに関して:そのコードのどのメソッドを使用する必要があるか、より具体的に教えていただけますか?私はそのセクションにはあまり詳しくありませんが、ノイズ除去や不鮮明化に関してドキュメントで役立つものを見つけられませんでした...事前に感謝します。
mchlfchr

1
:あなたはそこに、バージョンを「より使いやすく」を見つけることができますlear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
OLI

別の時間に文句を言ってごめんなさい;-) ... win32のソースもありますか?ありがとうございました!
mchlfchr

私がいないaffraid私は...だ
OLI

2

しきい値のテクニックをあきらめるのは早すぎると思います。あなたのヒストグラムを見てください、それは明らかにトライモーダルです:( 画像の右側の白い列を手動で削除しました、それらは画像の一部ではないと思います- コードを実行する前にこの画像撮ってください)

ここに画像の説明を入力してください

最初のグループのすべての値を見てください。

ここに画像の説明を入力してください

トライモーダルヒストグラムでモードを見つけるために、オン強度でK平均クラスタリングを使用することができK=3ます。次のMatlabコードはth1=67、コードで見つけます。考え方は、3つのセットがあると仮定し、各セットの加重重心を計算することです。次に、各強度レベルが独自のクラスターに割り当てられます。重心が移動しなくなると停止します。これは、ヒストグラムに表示されている画像の2つのしきい値を見つけた結果です。

ここに画像の説明を入力してください

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

後で問題を解決するのは簡単です。単に開くなどの簡単な形態学的操作を実行してください。


1
こんにちはAndrey、しかし、あなたが言及したしきい値処理の一般化はどのようにすればよいですか?それだけでなく、いくつかのケースがありましたが、まだ自動化が必要です。そして、Otsu Thresholding(matlabの関数)は良い結果を与えませんでした。その他のヒントはありますか?よろしく
-mchlfchr

こんにちは、これまでのところありがとう、しかしコードは機能しません。空白の画面が表示されます。私の元のデータ(ビットマップ)とあなたが上に投稿したPNGで試してみました。その間デバッグしています
...-mchlfchr

@mchlfchr、画像処理ツールボックスはありますか?そうでない場合は、変更することは可能であるimhisthist
アンドレイRubshtein

@mchlfchr、更新されたバージョンを参照してください
アンドレイRubshtein

アンドレイ、元のビットマップファイルを挿入すると、結果は元の投稿で述べたとおりです。たぶんこれは解像度に関して起こっていますか?ソース画像は576x768ピクセルでグレースケール(256)です。元の画像で関数を使用した場合の結果は次のとおりです。i.imgur.com / UXALJ.png関数のヒストグラム図:i.imgur.com/7RiPP.pngご協力ありがとうございます。よろしく
-mchlfchr

1

上記で提案したように、この画像ではしきい値設定は非常に効果的です。これは本質的にバイナリですが、不均等な照明のために一定のしきい値が実行されないことを除きます。適応しきい値処理が必要です。

私のアドバイスは、明るい領域で少数の値をサンプリングすることにより、単純なモデル(おそらく平面[3 DOF]またはquadradic [6 DOF])でバックグラウンド再構成を行うことです。最良の方法は、小さなROIを使用してノイズを平均化することです。次に、背景値を減算(または除算)して、シェーディングを修正します。

人間の介入がオプションではない場合、最初にまっすぐにOtsuを作成し、しきい値を十分に下回る均一なROI(低分散)を考慮することにより、背景領域の検索を自動化できます。最初の背景の再構成後、おそらくこのプロセスをフラット補正された画像に適用することで改善できます。

プロセス全体を実装して、1秒未満で実行できます。


こんにちは、自動処理が推奨されます。DOFの側面は興味深いですが、Otsu自体はうまく機能していないため、Otsuメソッドについてはわかりません。画像のランダムな領域を選択し、選択したすべての領域の平均値の後にしきい値を設定することを正しく理解していますか?よろしく
-mchlfchr

1

最適な方法はアクティブな輪郭を使用することだと思います。アクティブな輪郭がわからない場合は、YouTubeでこのビデオをご覧くださいhttp://www.youtube.com/watch?v=ijNe7f3QVdA

基本的に、uは初期化セグメンテーションを与える必要があり、形状を改善します。私の提案は、この投稿で説明されている方法の1つであり、2番目のステップとしてアクティブな輪郭を使用することです。改善ステップとして。

これは、http://www.mathworks.com/matlabcentral/fileexchange/19567を使用できるアクティブな輪郭の実装です


dsp.seへようこそ:)貢献してくれてありがとう、いい答えを提供してくれました。さらに改善したい場合は、これらの質問のいくつかに答えを提供することは興味深いと思います。すでに提案されているアプローチのどれを、あなたの提案と組み合わせてうまく機能すると思いますか?テクニックの簡単な説明を提供するか、時間があれば、提供されているサンプル画像のテクニックを使用して実験結果を提供してください。dspをお楽しみください!
ペネロペ

@mkuse、最初の投稿を読んだかもしれませんが、私は既にノイズ除去とエッジマップと組み合わせてアクティブな輪郭を試しました。結果は悪く、大きな画像の実行時間は悪かった。
mchlfchr

ノイズリダクションのテクニックをご覧ください。あなたはここで、これらの概要を見つけることができます:lnmiitdip.files.wordpress.com/2011/12/...
mkuse

1
@mkuse、私は最初の投稿であなたがあなたのPPTファイルに投稿したメカニズムについてすでに述べました。最初の投稿を編集して、使用したフィルターの種類をより明確にしました。
mchlfchr

0

あなたはあなたが何をしているのかを明確に知っていますが、しきい値を使用して言及していません、特に大津を使用してグローバルしきい値を適用して正しいレベルを計算し、輪郭を見つけて最大のものを選択しましたか?

[明確にするために編集]

画像全体に目に見える優雅さがあるため、グローバルしきい値は明らかに機能しません。

私はこれで簡単に遊びましたが、画像を6つのチャンク(サイズが同じ3列の2行)に分割し、それぞれにOtsuを使用してしきい値を設定してから再構築すると、画像。

星の右上にはまだいくつかの小さなアーティファクトがあります。

オブジェクトには直線の境界があるため、これらのエッジを抽出し、それらを交差させて頂点を見つけ、その結果をオブジェクトの輪郭として使用するために、ハフ変換を検討する必要があるかもしれません。


こんにちはDave、私はOtsuを試しましたが、右上の背景がオブジェクトにマージされるという効果をもたらします。これは絶対に受け入れられません。
mchlfchr

こんにちはDave、Houghはオプションではありません。実行時の要件のためであり、HTに関する知識がある限り、大きな画像の場合は非常に時間がかかります。
mchlfchr

0

アウトラインは常に直線ですか、それとも既知の曲線ですか?

その場合、各ピクセルをエッジに沿って正確に取得しようとするのではなく、ハフ変換を使用してラインの方程式を取得し、ラインとitnersectionsからカウントを再作成します


1
すでに述べたように、近くにリアルタイムのアプローチが必要です。そして、私がHTを知っている限り、それは非常に時間がかかります。もう1つの側面は、曲線がわからず、線が常に直線であるとは限らないことです。輪郭は、炉内にある材料によって異なります(詳細については、元の投稿を参照してください)。
mchlfchr

直線の場合、それはかなり高速です。そして、行がどこにあるか(例えば、前のフレームから)をおおよそ知っている場合、そのパラメータースペースのみを検索できます
Martin Beckett
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.