pythonはopencvに基づいて画像の輪郭を描きます。


イメージ輪郭概念
輪郭は一連の接続点からなる曲線で、物体の基本的な外形を表しています。
輪郭というと、エッジがよく似ています。簡単に言えば、輪郭は連続しており、エッジは全て連続していない(下図)。実はエッジは主に画像の特徴として使われています。例えばエッジの特徴を使って顔と手を区別できます。輪郭は主に物体の形態を分析するために用いられており、例えば物体の周囲と面積などは、エッジに輪郭が含まれていると言えます。

輪郭を探す操作は一般的に二値画像に用いられるので、閾値分割やCanyエッジ検出を用いてまず二値図を得ることが多い。
注意:輪郭を探すのは白い物体に対してのもので、必ず物体が白いことを保証します。背景は黒いです。そうでないと、多くの人が輪郭を探している時に一番外の枠を見つけます。
opencv画像の輪郭を見つける
cv.findContontoursを使って輪郭を探します。

import cv2 as cv
import numpy as np

img = cv.imread('j.png')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)

#          
contours, hierarchy = cv.findContours(
  thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

print(len(contours))
  • パラメータ2:輪郭の検索方法は、一般的にcv.RETR_を使用する。TREEは、すべての輪郭を抽出し、輪郭間の階層を作成することを示す。
  • パラメータ3:輪郭の近似方法。例えば直線については、この直線のすべてのピクセルポイントを記憶してもいいし、始点と終点だけを保存してもいいです。cv.CCを使っていますAPPROX_SIMPLEは、可能な限り少ないピクセルポイントで輪郭を表す。
  • は、簡単にするために、これらの2つのパラメータを、真の値3および2で直接表現することもできる。
  • 関数には2つの戻り値があります。hierarchyは輪郭間の階層関係です。これは無視できます。私たちは主にcontoursを見ています。それは見つけた輪郭です。チェーン形式で記憶して、各輪郭のすべての画素点の座標(x,y)を記録しました。

  • opencv画像の輪郭を描きます。
    輪郭を見つけたら、図のように赤色で描くことができます。cv.drawConturs()
    cv.drawConturs(img、contours、-1、(0、0、255)、2)
    パラメータ2はcontoursであり、パラメータ3はどの輪郭を描画するかを示し、-1はすべての輪郭を描画するかを示し、パラメータ4は色(B/G/Rチャネルであるため、(0,0,255)は赤)、パラメータ5は線幅である。
    経験談:多くの人が絵を描く時はカラーを使っていますが、効果がないです。どの絵に描いたのか確認してください。階調図と二値図には明らかにカラーがないです。
    一般的には、まず操作する輪郭を得て、輪郭の描画と分析を行います。
    cnt=contours[1]
    cv.drawContures(img)[cnt],0,(0,0,255),2)
    実験:画像の輪郭を探して描く
    
    import cv2 as cv
    import numpy as np
    
    img = cv.imread('jiao.jpg')
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    ret, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
    
    #          
    contours, hierarchy = cv.findContours(
      thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[1:6]
    
    cv.drawContours(img, cnt, -1, (0, 0, 255), 2)
    
    cv.imshow('result',img)
    cv.waitKey(0)
    cv.destroyAllWindows()
    実験結果

    以上はpythonがopencvに基づいて画像の輪郭を描いている詳細な内容です。pythonの画像の輪郭に関する資料は他の関連記事に注目してください。