2

現在、マンモグラフィーを使用したプロジェクトを開発しており、画像を検索可能領域 (ROI) と検索不可能領域の 2 つのセクションに分割する方法を理解しようとしています。この質問の焦点は、実際の画像分析/処理の基礎となるアルゴリズムのみに向けられています。Google と Stack Overflow からの結果のほとんどは有益な情報をもたらしましたが、画像分析/処理の手順、これらの手順が重要な理由、およびそれぞれが正確に何をしているのかを説明するものはありません。

画像を取得し、画像のサイズを変更し、画像を「バイナリ化」する小さなコード セグメントを作成しました。(以下。) バイナリ イメージで線 (等高線?) をトレースし、この線を元のイメージに移動し、それをガイドラインとして使用して、アルゴリズムで非検索領域 (ROI) を決定する方法はありますか?検索可能なエリア?これを行う簡単な方法はありますか?

// ** Main ** //
int main( int argc, char** argv )
{
  /// Load an image
  src = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE);

  // Create Dummy Image
  Mat destination;
  destination = cvCreateMat(3328/5, 4084/5, CV_32FC1);
  resize(src, destination,cvSize(3328/5,4084/5),0,0);
  src = destination;

  /// Create a matrix of the same type and size as src (for dst)
  dst.create( src.size(), src.type() );

  /// Create a window
  namedWindow( window_name, CV_WINDOW_AUTOSIZE );

  // Binarize the Image   
  threshold(src, dst, 128, 255,CV_THRESH_BINARY | CV_THRESH_OTSU); 

  // Show the Image
  imshow( window_name, dst );

  /// Wait until user exit program by pressing a key
  waitKey(0);

  return 0;
  }

明確化と繰り返しのために、私はかなりの数のチュートリアルを調べましたが、具体的には何も役に立ちませんでした. 私が得ることができるすべての助けに感謝します!

4

1 に答える 1

2

二値化された画像の線を見つけるには、再帰関数を使用し、データを保存できる画像と同じサイズの 2 つ目の配列を作成する必要があります。これは、二値化された画像のブロブを検出するために最近書いたコードの例です。 (注、これは C# であり、list ではなく vector<> を使用するなどの少しの適応が必要になります)。
まず、ピクセルを分析して、トレースする価値があるかどうか、またはトレースされていないかどうかを確認します。

private List<Blob> FindBlobs(bool[] Data, int Width, int Height)
{
    bool[] IsBlob = new bool[Data.Length];
    List<Blob> Blobs = new List<Blob>();

    for (int y = 0; y < Height; y++)
    {
        for (int x = 0; x < Width; x++)
        {
            if (Data[y * Width + x])
            {
                Blob b = new Blob();
                TrackBlob(b, Data, x, y, Width, Height);
                Blobs.Add(b);
            }
        }
    }
    return Blobs;
}

次に、各ブロブをトレースします。

private void TrackBlob(Blob blob, bool[] Data, int x, int y, int Width, int Height)
{
    for (int i = -1; i < 2; i++)
    {
        for (int j = -1; j < 2; j++)
        {
            if ((x + i) >= 0 && (x + i) < Width && (y + j) >= 0 && (y + j) < Height)
            {
                if (Data[(y + j) * Width + (x + i)])
                {
                    Data[(y + j) * Width + (x + i)] = false;
                    blob.AddPoint((x + i), (y + j));
                    TrackBlob(blob, Data, x + i, y + j, Width, Height);
                }
            }
        }
    }
}

これらを簡単に調整して、直線のみを検索できます(円形の線が必要かどうかはわかりません)。次に、線の交点を使用して、エッジの既知の線でオブジェクトを構築します。

または、Hough Lines and Circles (OpenCV で利用可能) を使用して、画像上の線と円をトレースすることもできます。これには、任意の方向に線を表示できるという利点がありますが、直線の終点は表示されません。

于 2012-06-18T01:26:36.440 に答える