9

画像の輪郭を抽出したい、ポイント座標のシーケンスとして表現する。Cannyの辺から1行の輪郭を抽出する

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

非常に薄い領域と見なされるように、私はしばしば2行を得ました。 輪郭線を単純化して、1本の線として描くことができます。または、正しい結果を直接生成する別の関数を使ってそれらを抽出することも、より良いでしょう。

私はOpenCVのドキュメントを見ましたが、何か役に立つものは見つけられませんでしたが、私は同じような問題の最初のものではないと思います。私が使用できる機能や方法はありますか?

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) 

スケールファクタは、輪郭の二重線を強調するために使用されます。ここでは

は、私がこれまでに書いたPythonコードです。ここ は、画像へのリンクです:

Canny
  • Contoursで抽出
    • Lenaグレースケール
    • Edges:あなたはfindContours

    いずれかによって製造間違っ結果を見ることができる10倍ズーム提案は大いに感謝されます。

  • +1

    あなたがHoughLines http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghlinesを使用する必要があります – Khashayar

    +0

    画像をぼかして騒音を減らす – baci

    +0

    私はそれが騒音の問題だとは思わないイメージ。あなたがCannyで抽出されたエッジを見てもOKです。 HoughLinesでは画像の曲線を扱うことができませんでしたか? – Muffo

    答えて

    6

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

    むしろ、findContoursメソッドが1行の複数の等高線を返す問題があります。

    キャニーはエッジ検出器であるためである - それはそれはラインの両方側に発生する画像の輝度勾配に同調フィルタであることを意味します。

    だからあなたの質問がより似ている:「?どのように私は1行に低レベルのエッジ特徴を変換することができます」、または多分:「どのように私は、単一の線を検出するために、輪郭の階層をナビゲートすることができますか?」

    このかなり共通の話題である - と、ここで一つの解決策を提案し、以前の記事である:

    OpenCV converting Canny edges to contours