11

ポイント座標のシーケンスとして表される画像の輪郭を抽出したいと思います。

を使用Cannyすると、画像のエッジのみを含むバイナリ イメージを生成できます。findContours次に、輪郭を抽出するために使用しようとしています。しかし、結果はOKではありません。

非常に薄い領域と見なされる場合のように、エッジごとに 2 つの線が得られることがよくありました。輪郭を単純化して、単一の線として描画できるようにしたいと思います。または、正しい結果を直接生成する別の関数でそれらを抽出する方がさらに良いでしょう。

OpenCV のドキュメントを調べましたが、役立つものは何も見つかりませんでしたが、同様の問題を抱えたのは私が初めてではないと思います。使用できる関数またはメソッドはありますか?

これまでに書いたPythonコードは次のとおりです。

def main():
    img = cv2.imread("lena-mono.png", 0)

    if img is None:
        raise Exception("Error while loading the image")

    canny_img = cv2.Canny(img, 80, 150)

    contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

    scale = 10
    contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale)

    for cnt in contours:
        color = np.random.randint(0, 255, (3)).tolist()
        cv2.drawContours(contours_img,[cnt*scale], 0, color, 1)

    cv2.imwrite("canny.png", canny_img)
    cv2.imwrite("contours.png", contours_img)

倍率は、等高線の二重線を強調するために使用されます。画像へのリンクは次のとおりです。

どんな提案でも大歓迎です。

4

1 に答える 1

8

私があなたを正しく理解していれば、あなたの質問はパラメトリック (ハフ変換)の意味で線を見つけることとは何の関係もありません.

むしろ、findContours1 つの線に対して複数の等高線を返すメソッドの問題です。

これは、Canny がエッジ検出器であるためです。つまり、線の両側で発生する画像強度勾配に合わせて調整されたフィルターであることを意味します。

したがって、あなたの質問は、「低レベルのエッジ フィーチャを単一の線に変換するにはどうすればよいですか?」、または「等高線階層をナビゲートして単一の線を検出するにはどうすればよいですか?」に似ています。

これはかなり一般的なトピックです。1 つの解決策を提案した以前の投稿を次に示します。

キャニーエッジを輪郭に変換するOpenCV

于 2014-08-06T08:44:58.857 に答える