- 1.セグメンテーションと輪郭
- 2.階層および取得モード
- 3.等高線の近似と凸包の検索
- 4.凸包
- 5.形状による輪郭のマッチング
- 6.形状の識別(円、長方形、三角形、正方形、星)
- 7.ライン検出
- 8.ブロブ検出
- 9.ブロブのフィルタリング–円と楕円のカウント
以前のチュートリアルでは、基本的な画像処理にOpenCVを使用し、いくつかの高度な画像編集操作を行いました。ご存知のとおり、 OpenCVはオープンソースのCommuter Vision Libraryであり、C ++、Python、Javaのインターフェイスを備え、Windows、Linux、Mac OS、iOS、Androidをサポートしています。そのため、PythonおよびLinux環境のRaspberryPiに簡単にインストールできます。また、OpenCVとカメラが接続されたRaspberry Piを使用して、顔検出、顔ロック、オブジェクトトラッキング、車のナンバープレート検出、ホームセキュリティシステムなど、多くのリアルタイム画像処理アプリケーションを作成できます。このチュートリアルでは、その方法を学習します。 OpenCVを使用した画像セグメンテーション。実行する操作は次のとおりです。
- セグメンテーションと輪郭
- 階層および取得モード
- 輪郭を近似し、凸包を見つける
- コネックスハル
- マッチング輪郭
- 形状の識別(円、長方形、三角形、正方形、星)
- ライン検出
- ブロブ検出
- ブロブのフィルタリング–円と楕円のカウント
1.セグメンテーションと輪郭
画像セグメンテーションは、画像をさまざまな領域に分割するプロセスです。一方、輪郭は、画像内のオブジェクトの境界全体を境界またはカバーする連続した線または曲線です。そして、ここでは、輪郭と呼ばれる画像セグメンテーション手法を使用して、画像の一部を抽出します。
また、輪郭は非常に重要です
- 物体検出
- 形状分析
また、実世界の画像分析からMRIのような医療画像分析まで、非常に幅広い応用分野があります。
正方形の輪郭を抽出して、opencvで輪郭を実装する方法を教えてください。
import cv2 import numpy as np
3つの黒い四角のある単純な画像をロードしましょう
image = cv2.imread( 'squares.jpg') cv2.imshow( 'input image'、image) cv2.waitKey(0)
グレースケール
灰色= cv2.cvtColor(画像、cv2.COLOR_BGR2GRAY)
キャニーエッジを見つける
edged = cv2.Canny(gray、30,200) cv2.imshow( 'canny Edges'、edged) cv2.waitKey(0)
輪郭を見つける
#画像のコピーを使用します(例:-edged.copy())。輪郭を見つけると画像が変更されるため、 #OpenCVバージョンのアップグレードによる空の引数として輪郭の前に_を追加する必要があります _、contours、hierarchy = cv2.findContours(edged、cv2.RETR_EXTERNAL、cv2.CHAIN_APPROX_NONE) cv2.imshow( '輪郭を描いた後のキャニーエッジ'、エッジ) cv2.waitKey(0)
輪郭ファイルを印刷して、輪郭が何で構成されているかを確認します
print(contours) print( '見つかった輪郭の数=' + str(len(contours)))
すべての輪郭を描く
#-1を3番目のパラメーターとして使用して、すべての輪郭を描画します cv2.drawContours(image、contours、-1、(0,255,0)、3) cv2.imshow( 'contours'、image) cv2.waitKey(0) cv2。 destroyAllWindows()
コンソール出力-]、
]、
]、
…、
]、
]、
]]、
dtype = int32)、
アレイ(]、
]、
]、
…、
]、
]、
]]、dtype = int32)、array(]、
]、
]、
…、
]、
]、
]]、dtype = int32)]
見つかった輪郭の数= 3。したがって、合計3つの輪郭が見つかりました。
さて、上記のコードでは 、 を使用して輪郭ファイルも印刷しました 。 このファイルは、上記のコンソール出力で印刷されたように、これらの輪郭がどのように見えるかを示しています。
上記のコンソール出力には、x、yポイントの座標のような行列があります。OpenCVは、リストのリストに等高線を格納します。上記のコンソール出力を次のように簡単に表示できます。
CONTOUR 1 CONTOUR 2 CONTOUR 3
]、array(]、array(]、
]、]、]、
]、]、]、
…、…、…、
]、]、]、
]、]、]、
]]、dtype = int32)、]]、dtype = int32)、]]、dtype = int32)]
ここで、等高線ファイルで長さ関数を使用すると、長さが3になります。これは、そのファイルに3つのリストのリスト、つまり3つの等高線があったことを意味します。
ここで、CONTOUR 1がその配列の最初の要素であり、そのリストにすべての座標のリストが含まれていると想像してください。これらの座標は、緑色の長方形のボックスとして、先ほど見た輪郭に沿った点です。
これらの座標を保存する方法はいくつかあり、これらは近似法と呼ばれます。基本的に近似法には2つのタイプがあります。
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONEはすべての境界点を格納しますが、必ずしもすべての境界点が必要なわけではありません。点が直線を形成する場合、その線上の始点と終点のみが必要です。
cv2.CHAIN_APPROX_SIMPLEは、代わりに境界輪郭の開始点と終了点のみを提供します。その結果、輪郭情報をはるかに効率的に保存できます。
_、contours、hierarchy = cv2.findContours(edged、cv2.RETR_EXTERNAL、cv2.CHAIN_APPROX_NONE)
上記のコードでは、 cv2.RETR_EXTERNAL は取得モードであり、 cv2.CHAIN_APPROX_NONE は取得モードです。
近似法。
これで、輪郭と近似方法について学習しました。次に、階層と検索モードについて説明します。
2.階層および取得モード
取得モードは、サブコンター、外部コンター、またはすべてのコンターなどのコンターの階層を定義します。
現在、階層タイプでソートされた4つの取得モードがあります。
cv2.RETR_LIST –すべての輪郭を取得します。
cv2.RETR_EXTERNAL –外部または外部の輪郭のみを取得します。
cv2.RETR_CCOMP –2レベルの階層ですべてを取得します。
cv2.RETR_TREE –完全な階層のすべてを取得します。
階層は次の形式で保存されます
ここで、最初の2つの取得モードcv2.RETR_LISTとcv2.RETR_EXTERNALの違いを説明しましょう。
import cv2 import numpy as np
3つの黒い四角のある単純な画像をロードしましょう
image = cv2.imread( 'square donut.jpg') cv2.imshow( 'input image'、image) cv2.waitKey(0)
グレースケール
灰色= cv2.cvtColor(画像、cv2.COLOR_BGR2GRAY)
キャニーエッジを探す
edged = cv2.Canny(gray、30,200) cv2.imshow( 'canny Edges'、edged) cv2.waitKey(0)
輪郭を見つける
#画像のコピーを使用します(例:-edged.copy())。輪郭を見つけると画像が変更されるため、 #open cvバージョンのアップグレードによる空の引数として輪郭の前に_を追加する必要があります _、contours、hierarchy = cv2.findContours(edged、cv2.RETR_EXTERNAL、cv2.CHAIN_APPROX_NONE) cv2.imshow( '輪郭を描いた後のキャニーエッジ'、エッジ) cv2.waitKey(0)
輪郭ファイルを印刷して、輪郭が何で構成されているかを確認します。
print(contours) print( '見つかった輪郭の数=' + str(len(contours)))
すべての輪郭を描く
#-1を3番目のパラメーターとして使用して、すべての輪郭を描画します cv2.drawContours(image、contours、-1、(0,255,0)、3) cv2.imshow( 'contours'、image) cv2.waitKey(0) cv2。 destroyAllWindows
import cv2 import numpy as np
3つの黒い四角のある単純な画像をロードしましょう
image = cv2.imread( 'square donut.jpg') cv2.imshow( 'input image'、image) cv2.waitKey(0)
グレースケール
灰色= cv2.cvtColor(画像、cv2.COLOR_BGR2GRAY)
キャニーエッジを見つける
edged = cv2.Canny(gray、30,200) cv2.imshow( 'canny Edges'、edged) cv2.waitKey(0)
輪郭を見つける
#画像のコピーを使用します(例:-edged.copy())。輪郭を見つけると画像が変更されるため、 #open cvバージョンのアップグレードによる空の引数として輪郭の前に_を追加する必要があります _、contours、hierarchy = cv2.findContours(edged、cv2.RETR_LIST、cv2.CHAIN_APPROX_NONE) cv2.imshow( '輪郭を描いた後のキャニーエッジ'、エッジ) cv2.waitKey(0)
等高線ファイルを印刷して、等高線が何で構成されているかを確認します。
print(contours) print( '見つかった輪郭の数=' + str(len(contours)))
すべての輪郭を描く
#-1を3番目のパラメーターとして使用して、すべての輪郭を描画します cv2.drawContours(image、contours、-1、(0,255,0)、3) cv2.imshow( 'contours'、image) cv2.waitKey(0) cv2。 destroyAllWindows()
したがって、上記のコードのデモンストレーションを通じて、 cv2.RETR_LIST と cv2.RETR_EXTERNNALの 違いを明確に確認できます 。cv2.RETR_EXTERNNAL では、外側の輪郭のみが考慮され、内側の輪郭は無視されます。
滞在中 cv2.RETR_LIST 内側の輪郭も考慮されています。
3.等高線の近似と凸包の検索
輪郭を近似する場合、輪郭形状は別の輪郭形状の上に近似されますが、これは最初の輪郭形状とそれほど類似していない場合があります。
近似には、以下で説明するopenCVの approxPolyDP 関数を使用します。
cv2.approxPolyDP(等高線、近似精度、閉じた)
パラメーター:
- 輪郭–近似したい個々の輪郭です。
- 近似精度-近似の精度を決定する上で重要なパラメータ。値が小さいと正確な近似が得られ、値が大きいとより一般的な情報が得られます。適切な親指のルールは、輪郭の周囲の5%未満です。
- Closed –おおよその輪郭を開くことができるか閉じることができるかを示すブール値。
家の簡単な図を概算してみましょう
インポートnumpyののNPとして インポートCV2
画像を読み込んでコピーを保存する
image = cv2.imread( 'house.jpg') orig_image = image.copy() cv2.imshow( 'original image'、orig_image) cv2.waitKey(0)
画像をグレースケールして2値化します
灰色= cv2.cvtColor(画像、cv2.COLOR_BGR2GRAY) ret、thresh = cv2.threshold(灰色、127,255、cv2.THRESH_BINARY_INV)
輪郭を見つける
_、等高線、hierarchy = cv2.findContours(thresh.copy()、cv2.RETR_LIST、cv2.CHAIN_APPROX_NONE)
各輪郭を反復処理し、それらの境界矩形を計算します
等高線のcの場合: x、y、w、h = cv2.boundingRect(c) cv2.rectangle(orig_image、(x、y)、(x + w、y + h)、(0,0,255)、2) cv2.imshow( 'Bounding rect'、orig_image) cv2.waitKey(0)
各等高線を反復処理し、おおよその等高線を計算します
等高線のcの場合:
#輪郭の周囲の 精度の パーセントとして精度を計算する= 0.03 * cv2.arcLength(c、True)approx = cv2.approxPolyDP(c、accuracy、True) cv2.drawContours(image,, 0、(0,255,0)、2) cv2.imshow( 'おおよそのpolyDP'、画像) cv2.waitKey(0) cv2.destroyAllWindows()
4.凸包
凸包は基本的に外縁であり、特定の図の上に線を引くことで表されます。
これは、オブジェクト自体の周囲に収まる最小のポリゴンである可能性があります。
import cv2 import numpy as np image = cv2.imread( 'star.jpg') gray = cv2.cvtColor(image、cv2.COLOR_BGR2GRAY) cv2.imshow( 'original image'、image) cv2.waitKey(0)
画像のしきい値
ret、thresh = cv2.threshold(gray、176,255,0)
輪郭を見つける
_、等高線、hierarchy = cv2.findContours(thresh.copy()、cv2.RETR_LIST、cv2.CHAIN_APPROX_NONE)
輪郭を面積で並べ替えてから、最大のフレーム輪郭を削除します
n = len(contours)-1 どんなcontours = sorted(contours、key = cv2.contourArea、reverse = False)
輪郭を繰り返し、凸包を描きます
等高線のcの場合:
hull = cv2.convexHull(c) cv2.drawContours(image,, 0、(0,255,0)、2) cv2.imshow( 'convex hull'、image) cv2.waitKey(0) cv2.destroyAllWindows()
5.形状による輪郭のマッチング
cv2.matchShapes(輪郭テンプレート、輪郭メソッド、メソッドパラメーター)
出力–一致値(値が小さいほど一致が近いことを意味します)
輪郭テンプレート–これは新しい画像で見つけようとしている参照輪郭です。
輪郭–チェックしている個々の輪郭。
方法–輪郭マッチングのタイプ(1,2,3)。
メソッドパラメータ– 0.0のままにします(python opencvでは使用されません)
import cv2 import numpy as np
形状テンプレートまたは参照画像をロードします
template = cv2.imread( 'star.jpg'、0) cv2.imshow( 'template'、template) cv2.waitKey(0)
一致させようとしている形状をターゲット画像にロードします
target = cv2.imread( 'shapestomatch.jpg') gray = cv2.cvtColor(target、cv2.COLOR_BGR2GRAY)
cv2.findContours を使用する前に、最初に両方の画像をしきい値設定し ます
ret、thresh1 = cv2.threshold(template、127,255,0) ret、thresh2 = cv2.threshold(gray、127,255,0)
テンプレートで輪郭を見つける
_、contours、hierarhy = cv2.findContours(thresh1、cv2.RETR_CCOMP、cv2.CHAIN_APPROX_SIMPLE) #最大の輪郭を削除できるように、面積で輪郭を並べ替える必要があります。
画像の概要
sort_contours = sorted(contours、key = cv2.contourArea、reverse = True) #テンプレートの輪郭となる2番目に大きい輪郭を抽出し ます tempelate_contour = contraus#2番目のターゲット画像から輪郭を抽出します_、contours、hierarchy = cv2.findContours (thresh2、cv2.RETR_CCOMP、cv2.CHAIN_APPROX_SIMPLE) 輪郭のcの場合: #ターゲット画像の各輪郭を繰り返し、cv2.matchShapeを使用して輪郭の形状を比較します match = cv2.matchShapes(tempelate_contour、c、1,0.0) print ( "match") #if match value is less than 0.15 if match <0.16: closest_contour = c else: closest_contour = cv2.drawContours(target,,-1、(0,255,0)、3)cv2.imshow( 'output' 、目標) cv2.waitKey(0) cv2.destroyAllWindows()
コンソール出力–
0.16818605122199104
0.19946910256158912
0.18949760627309664
0.11101058276281539
異なる数学関数を有する三つの異なる方法があり、私たちはcv2.matchShapes(tempelate_contour、C、置き換えることによって、それぞれの方法を試すことができる1は、異なるマッチを取得する各値について、1,2および3からの変化、0.0)メソッド値をコンソール出力の値。
6.形状の識別(円、長方形、三角形、正方形、星)
OpenCVは、画像からさまざまな種類の形状を自動的に検出するためにも使用できます。以下のコードを使用することにより、画像から円、長方形、三角形、正方形、星を検出することができます。
import cv2 import numpy as np
画像を読み込んでからグレースケール
image = cv2.imread( 'shapes.jpg') gray = cv2.cvtColor(image、cv2.COLOR_BGR2GRAY) cv2.imshow( 'identifying shape'、image) cv2.waitKey(0) ret、thresh = cv2.threshold(gray 、127,255,1)
輪郭を抽出する
_、contours、hierarchy = cv2.findContours(thresh.copy()、cv2.RETR_LIST、cv2.CHAIN_APPROX_NONE)
等高線のcntの場合:
おおよそのポリゴンを取得する approx = cv2.approxPolyDP(cnt、0.01 * cv2.arcLength(cnt、True)、True) if len(approx)== 3: shape_name = "Triangle" cv2.drawContours(image,, 0、(0,255、 0)、-1)
輪郭の中心を見つけて、テキストを中央に配置します
M = cv2.moments(cnt) cx = int(M / M) cy = int(M / M) cv2.putText(image、shape_name、(cx-50、cy)、cv2.FONT_HERSHEY_SIMPLEX、1、(0,0 、0)、1) elif len(approx)== 4: x、y、w、h = cv2.boundingRect(cnt) M = cv2.moments(cnt) cx = int(M / M) cy = int(M / M)
その4辺のポリゴンが正方形か長方形かを確認します
#cv2.boundingRectは、左上 隅 から始めて、ピクセル単位で左の幅と高さを返します。正方形の場合、abs(wh)<= 3: shape_name = "square" #テキストを配置する輪郭の中心を見つける とほぼ同じになります。 center cv2.drawContours(image,, 0、(0,125,255)、-1) cv2.putText(image、shape_name、(cx-50、cy)、cv2.FONT_HERSHEY_SIMPLEX、1、(0,0,0)、1) else : shape_name = "Reactangle" #輪郭の中心を見つけてテキストを中心に 配置cv2.drawContours(image,, 0、(0,0,255)、-1) M = cv2.moments(cnt) cx = int(M / M) cy = int(M / M) cv2.putText(image、shape_name、(cx-50、cy)、cv2.FONT_HERSHEY_SIMPLEX、1、(0,0,0)、1) elif len(approx)== 10: shape_name = '星' cv2.drawContours(image,, 0、(255,255,0)、-1) M = cv2.moments(cnt) cx = int(M / M) cy = int(M / M) cv2.putText(image、shape_name、 (cx-50、cy)、cv2.FONT_HERSHEY_SIMPLEX、1、(0,0,0)、1) elif len(approx)> = 15: shape_name = 'circle' cv2.drawContours(image,, 0、(0,255,255) 、-1) M = cv2.moments(cnt) cx = int(M / M) cy = int(M / M) cv2.putText(image、shape_name、(cx-50、cy)、cv2.FONT_HERSHEY_SIMPLEX、1、 (0,0,0)、1) cv2.imshow( '図形の識別'、画像) cv2.waitKey(0) cv2.destroyAllWindows()
7.ライン検出
ライン検出はOpenCVで非常に重要な概念であり、現実の世界で有望な用途があります。自動運転車は、車線や道路の検出にライン検出アルゴリズムを使用します。
ライン検出では、2つのアルゴリズムを扱います。
- ハフラインアルゴリズム
- 確率的ハフラインアルゴリズム。
高校の数学の直線をy = mx + cという方程式で表現したことを覚えているかもしれません。
ただし、OpenCVでは行は別の方法で表されます
ρ=xcosӨ+ysincosӨの上の式は、線のOpenCV表現です。ここで、ρは原点からの線の垂直距離であり、Өはこの線の原点への法線によって形成される角度です(ラジアンで測定、1piラジアン/ 180 = 1度)。
ラインを検出するためのOpenCV関数は次のように与えられます。
cv2.HoughLines(2値化された画像、ρ精度、θ精度、しきい値)。 ここで、しきい値は、線と見なされるための最小投票数です。
それでは、opencvのハフライン機能を使用してボックス画像のラインを検出しましょう。
import cv2 import numpy as np image = cv2.imread( 'box.jpg')
グレースケールとキャニーエッジが抽出されました
灰色= cv2.cvtColor(画像、cv2.COLOR_BGR2GRAY) エッジ= cv2.Canny(灰色、100,170、apertureSize = 3)
1ピクセルのrho精度を使用してハフラインを実行します
#1度である(np.pi / 180)のシータ精度 #lineしきい値は240(ライン上のポイントの数)に設定されます lines = cv2.HoughLines(edges、1、np.pi / 180、240 )#we iterate各行を介して、範囲(0、len(lines))のiの場合はcv2.lines(つまりエンドポイントが必要) で #requiredの形式に変換します:rhoの場合、行のtheta: a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho x1 = int(x0 + 1000 *(-b)) y1 = int(y0 + 1000 *(a)) x2 = int(x0-1000 *( -b)) y2 = int(y0-1000 *(a)) cv2.line(image、(x1、y1)、(x2、y2)、(0,255,0)、2) cv2.imshow( 'hough lines' 、image) cv2.waitKey(0) cv2.destroyAllWindows()
次に、確率的ハフラインの他のアルゴリズムを使用して、上記のライン検出を繰り返します。
確率的ハフラインの背後にある考え方は、ライン検出に十分なポイントのランダムなサブセットを取得することです。
確率的 ハフライン のOpenCV関数は、 cv2.HoughLinesP(2値化された画像、ρ精度、θ精度、しきい値、最小ライン長、最大ラインギャップ) として表され ます。
次に、確率的ハフ線を使用してボックス線を検出しましょう。
import cv2 import numpy as np
グレースケールとキャニーエッジが抽出されました
image = cv2.imread( 'box.jpg') gray = cv2.cvtColor(image、cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray、50,150、apertureSize = 3) #ここでも同じrhoとthetaの精度を使用します #ただし、100の最小投票(線に沿ったポイント) #5ピクセルの最小線長、および10ピクセルの 線 間の最大ギャップlines = cv2.HoughLinesP(edges、1、np.pi / 180,100,100,10)i in range(0、len(lines)): for x1、y1、x2、y2 in lines: cv2.line(image、(x1、y1)、(x2、y2)、(0,255,0)、3) cv2。 imshow( 'probalistic hough lines'、image) cv2.waitKey(0) cv2.destroyAllWindows
8.ブロブ検出
ブロブは、すべてが共通のプロパティを共有する接続されたピクセルのグループとして説明できます。OpenCVブロブ検出器の使用方法は、このフローチャートで説明されています。
キーポイントを描画するために、次の引数を取る cv2.drawKeypoints を使用します。
cv2.drawKeypoints(input image、keypoints、blank_output_array、color、flags)
フラグのどこにある可能性があります
cv2.DRAW_MATCHES_FLAGS_DEFAULT
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
ここでの空白は、ゼロの1つずつの行列に他なりません。
次に、ヒマワリの画像でブロブ検出を実行します。ブロブは、すべての花に共通しているため、花の中心部分になります。
import cv2 import numpy as np image = cv2.imread( 'Sunflowers.jpg'、cv2.IMREAD_GRAYSCALE)
デフォルトのパラメータで検出器を設定する
検出器= cv2.SimpleBlobDetector_create()
ブロブを検出する
キーポイント= detector.detect(image)
検出されたブロブを赤い円として描画します
#cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS は、円の #サイズがblobのサイズに対応することを確認しますblank = np.zeros((1,1)) blobs = cv2.drawKeypoints(image、keypoints、blank、(0,255,255)、cv2.DRAW_MATCHES_FLAGS_DEFAULT)
キーポイントを表示する
cv2.imshow( 'blobs'、 blobs )cv2.waitKey(0)cv2.destroyAllWindows()
コードは正常に機能しますが、前の花が最後の花に比べて大きいため、花のサイズが不均一であるために一部のブロブが欠落しています。
9.ブロブのフィルタリング–円と楕円のカウント
形状、サイズ、色に応じてブロブをフィルタリングするためのパラメータを使用できます。ブロブ検出器でパラメーターを使用するには、OpenCVの関数を使用します
cv2.SimpleBlobDetector_Params()
主に以下にリストされているこれらの4つのパラメーターによってblobをフィルタリングすることがわかります。
範囲
params.filterByArea = True / False params.minArea = pixel params.maxArea = pixel
真円度
params.filterByCircularity = True / False params.minCircularity = 1は完全で、0は反対です
凸面-ブロブの面積/凸包の面積
params.filterByConvexity = True / False params.minConvexity = Area
慣性
params.filterByInertia = True / False params.minInertiaRatio = 0.01
それでは、上記のパラメータでBLOBをフィルタリングしてみましょう。
import cv2 import numpy as np image = cv2.imread( 'blobs.jpg') cv2.imshow( 'original image'、image) cv2.waitKey(0)
デフォルトのパラメータを使用して検出器を初期化します
検出器= cv2.SimpleBlobDetector_create()
ブロブを検出する
keypoints = detector.detect(image)
画像に赤い円としてブロブを描画します
blank = np.zeros((1,1)) blobs = cv2.drawKeypoints(image、keypoints、blank、(0,0,255)、cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len( keypoints )text = "ブロブの総数" + str (len( keypoints ))cv2.putText(blobs、text、(20,550)、cv2.FONT_HERSHEY_SIMPLEX、1、(100,0,255)、2)
BLOBキーポイントを使用して画像を表示する
cv2.imshow( 'デフォルトパラメータを使用したblob'、 blobs )cv2.waitKey(0)
フィルタリングパラメータを設定します
#cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params()を使用してパラメーター設定を初期化します
エリアフィルタリングパラメータを設定する
params.filterByArea = True params.minArea = 100
真円度フィルタリングパラメータを設定する
params.filterByCircularity = True params.minCircularity = 0.9
凸フィルタリングパラメータを設定します
params.filterByConvexity = False params.minConvexity = 0.2
慣性フィルタリングパラメータを設定します
params.filterByInertia = True params.minInertiaRatio = 0.01
パラメータを使用して検出器を作成する
検出器= cv2.SimpleBlobDetector_create(params)
ブロブを検出する
keypoints = detector.detect(image)
赤い円として画像にブロブを描きます
blank = np.zeros((1,1)) blobs = cv2.drawKeypoints(image、keypoints、blank、(0,255,0)、cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len( keypoints )text = "円形ブロブの総数" + str(len( keypoints ))cv2.putText(blobs、text、(20,550)、cv2.FONT_HERSHEY_SIMPLEX、1、(0,100,255)、2)
ブロブを表示する
cv2.imshow( '循環ブロブのフィルタリング'、 blobs )cv2.waitKey(0)cv2.destroyAllWindows()
つまり、これがPython-OpenCVで画像セグメンテーションを実行する方法です。コンピュータービジョンとOpenCVを十分に理解するには、以前の記事を参照してください(PythonOpenCVとPythonOpenCVでの画像操作の開始を行うと、コンピュータービジョンで何かクールなものを作ることができます。