1

Python OpenCVを使用して、エッジ検出画像のすべてのエッジを見つけて分離しようとしています。エッジは輪郭の形にすることができますが、そうである必要はありません。接続されたすべてのエッジピクセルをグループ化したいだけです。したがって、技術的には、アルゴリズムは手続き的に次のように聞こえるかもしれません。

  1. エッジ ピクセルごとに、隣接する (接続された) エッジ ピクセルを見つけて、それが見つからなくなるまで、画像の現在のサブディビジョンに追加します。
  2. 次に、チェックされていない次のエッジ ピクセルに移動し、新しいサブディビジョンを開始して、1) をもう一度実行します。

調べてみましcv.findContoursたが、結果は満足のいくものではありませんでした。おそらく、自由端ではなく輪郭 (囲まれたエッジ) を対象としていたためです。結果は次のとおりです。

元のエッジが検出されました:

輪郭処理後:

5 つのエッジがそれぞれ画像の独自のサブディビジョンにグループ化されることを期待していましたが、どうやら cv2.findContours 関数は 2 つのエッジをさらにサブディビジョンに分割しますが、これは望ましくありません。

これら2つの画像を保存するために使用したコードは次のとおりです。

    def contourForming(imgData):
      cv2.imshow('Edge', imgData)
      cv2.imwrite('EdgeOriginal.png', imgData)
      contours = cv2.findContours(imgData, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
      cv2.imshow('Contours', imgData)
      cv2.imwrite('AfterFindContour.png', imgData)
      cv2.waitKey(0)
      pass

ただし、私の実装には制限があります。Python 2.7 と OpenCV2 を使用する必要があります。これら以外のリビジョンや言語は使用できません。私がこれを言うのは、OpenCV 2 には C++ を使用した connectedComponent 関数があることを知っているからです。私はそれを使用することができましたが、問題は、特定の制限のために使用できないことです.

それで、私は問題にどのようにアプローチすべきか考えていますか?

4

1 に答える 1

2

findContoursを使用することは正しいアプローチです。単に間違っています。

ドキュメントを詳しく見てみましょう。

注:ソース イメージは、この関数によって変更されます。

あなたの「輪郭処理後」の画像は、実際には からのガベージ結果ですfindContours。このため、 の呼び出し後に元のイメージをそのまま残したい場合はfindContours、クローン イメージを関数に渡すのが一般的です。

意味のある結果findContoursは にありcontoursます。drawContoursを使用して、通常は新しい画像に描画する必要があります。

これは私が得る結果です:

ここに画像の説明を入力

次の C++ コードを使用します。

#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char** argv)
{
    // Load the grayscale image
    Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

    // Prepare the result image, 3 channel, same size as img, all black
    Mat3b res(img.rows, img.cols, Vec3b(0,0,0));

    // Call findContours
    vector<vector<Point>> contours;
    findContours(img.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);

    // Draw each contour with a random color
    for (int i = 0; i < contours.size(); ++i)
    {
        drawContours(res, contours, i, Scalar(rand() & 255, rand() & 255, rand() & 255));
    }

    // Show results
    imshow("Result", res);
    waitKey();

    return 0;
}

Python への移植はかなり簡単なはずです (申し訳ありませんが、テストできないため、Python コードを提供することはできません)。また、特定のOpenCV - Python チュートリアルfindContoursを見て、とを正しく使用する方法を確認することもできdrawContoursます。

于 2015-11-23T12:56:30.430 に答える