3

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

画像処理をしなければなりませんが、どこから始めればいいのかわかりません。私の問題は次のとおりです:-

2Dファイバー画像(この投稿に添付)があります。ファイバーのエッジは白で示され、ファイバーの内側は黒です。ファイバー内の黒いピクセルを選択し、そこからファイバーの長さに沿って移動したいと思います。これには、コントラストを周囲のピクセルと比較してから、目的の方向に移動することが含まれます。私の主な目的は、繊維の長さを見つけることです

それで、誰かが少なくともどこから始めればいいのか教えてもらえますか?私は自分の問題にどのように取り組むかについて大まかなアルゴリズムを頭に入れましたが、どのソフトウェア/ライブラリを使用するかさえわかりません。

よろしくアディ

EDIT1-OpenCVの代わりに、MATLABを使い始めたのは、はるかに簡単だと思ったからです。ハフ変換を適用してから、最大数でハフピーク関数を適用しました。ピークの数=100であるため、すべてのファイバーが含まれます。その後、次の画像を取得しました。どうすれば今の長さを見つけることができますか?

EDIT2-ハフ変換を使用して長さを計算する方法に関する研究記事を見つけましたが、MATLABで実装できません。誰か助けてください

4

5 に答える 5

2

あなたの画像が投稿したものと同じくらいきれいであれば、それは非常に簡単な問題です.

私が試す最初の手法は、ハフ変換を使用してライン パラメーターを推定することです。OpenCV にはアルゴリズムの優れた実装があります。それらを取得したら、他の制約に基づいて、必要な方法でそれらの長さを見積もることができます。

于 2012-07-29T04:07:29.270 に答える
0

私が見ているように、問題は2つあります。1)開始位置から開始点と終了点を見つけます。2)開始点と終了点の間の長さを決定します

入力データがわからないので、各ピクセルに0..1のデータが「白さ」を表すピクセルデータだと思います。

終点を見つけるために、私はさまざまな場所を歩こうとするある種のWALKER / AIを実行し、元の位置と最後に通過した方向を知ってから、「前方弧」がすべて白になるまでそのルートに沿って進みます。これは、ファイバーがややまっすぐであることを前提としています(そうですか?)。

開始点と終了点を取得したら、これらをaa *パスファインディングアルゴリズムに入力して、黒のピクセルに低い値を与え、白に非常に高い値を与えることができます。次に、始点と終点の間の最短距離、つまりファイバーの長さを見つけます。

使用するテクニックや入力データの例がわからないため、詳細を説明するのは難しいです。

于 2012-07-28T15:43:37.367 に答える
0

前提: -この画像は、0 (黒) と 1 (白) のみのバイナリ イメージと見なすことができます。-すべての繊維が直線で、始点と終点が境界線上にあります。・繊維の太さ(白線の太さ)の限界を知ることができます。

これらの仮定の下で:最初の白いピクセルに遭遇するまで、画像の境界線のスキャンを開始します(どこからでも、どの方向でも好きなところから始めてください...一貫性を保ちます)。この時点で、プログラムはこれが間違いなく開始点であることを理解します. これを知ることで、特定の制限 (またはしきい値) に達するまで、すべての白いピクセルを収集できます。ここでの考え方は、繊維がある場合、繊維と開始点が存在する境界線との間の角度を取得することです...もちろん、取得するピクセルが多いほど (取得する内側)、より確実に終わり。これは最もトリッキーな部分です。どういうわけか線で終わった後...角度を計算する必要があります(基本的な三角法)。開始点、画像の幅/高さ、および角度 (またはそれらの cos/sin) がわかっているので、終了点の正確な座標が得られます。注意してください... ここでの正確さは、cos/sin 値の計算エラーが発生する可能性があるため、実際には理解されていない可能性があります。したがって、しきい値をできるだけ長く保持する必要があります。したがって、終点は実際には点ではなく、終点がその領域内のどこかにある可能性を示す領域になります。あとは簡単な計算です。

明らかに、ファイバーを作る両方の白い線をチェックしてどちらが長いかを決定するなど、この方法に詳細を入れすぎることができます。または、これらの線が適切にまっすぐではないため、エラーのマージンを許容することもできます...これは概念的なステージなどに厚みが出ます。

プログラミング: C# には優れた機能があり、簡単に使用できます...ここにコードをいくつか載せます...

newBitmap = new Bitmap(openFileDialog1.FileName);

for (int x = 0; x < newBitmap.Width; x++)
{
   for (int y = 0; y < newBitmap.Height; y++)
   {
      Color originalColor = newBitmap.GetPixel(x, y);//gets the pixel value...
      //things go here...
   }
}

openfiledialog から画像を取得し、画像をビットマップします。ネストされた for ループ内で、このコードは画像を左から右にスキャンしますが、これは変更できます...

于 2012-07-28T21:40:10.437 に答える
0

あなたは C++ と C を知っているので、OpenCVをお勧めし ます。これはオープンソースなので、私のような人を信用しなくても問題ありません ;)。また、@VictorS のような C# を使用する場合。OpenCVのC#と同等であるEmguCVを使用することに言及しました。OpenCV のチュートリアルが含まれており、EmguCV のチュートリアルはWeb サイトにあります。お役に立てれば!

于 2012-07-29T00:58:26.140 に答える
0

3Dslicer の最新バージョンをダウンロードしてインストールし、データをロードして、パッケージ>アトラスなしの EM セグメンター> に移動します。

セグメンテーション

2 つの異なるラベルで解剖学的ツリーを選択します。後ろのラベルは目的で、白い端です。ROI として 2D 画像全体を選択し、セグメントをクリックします。

これが結果です。エッジに緑のラベルを付け、黒い領域に白のラベルを付けました

エッジ

黒い部分

ツリーを修正し、定義した構造を変更できます。より正確にするために、より多くのサンプルをセグメンテーションに与えることができます。

于 2018-10-26T10:54:58.620 に答える