画像セグメンテーションの基礎は、画像内の各領域が異なる特性 (グレースケール、色、テクスチャなど) を持っているという事実に基づいています。画像セグメンテーションの目的は、画像を類似または同一の特性を持ついくつかのサブ領域に分割して、セグメント化された関連領域でターゲットを引き続き抽出し、その特性または構造情報に従ってそれを分類および識別することです。画像全体の解析結果の説明情報が表示されます。したがって、画像のセグメンテーションは特に重要です。
デジタル画像では、画像のセグメンテーションに対して比較的厳密な定義があります。1.
分割されたすべてのサブ領域の合計が、元の領域 R を形成できる必要があります。
2. 分割されたサブエリアが互いに重ならない。
3. セグメンテーションによって得られた同じ領域に属するピクセルは、いくつかの同じ特性を持つ必要があります。
4. セグメンテーションによって得られた異なる領域に属するピクセルは、異なる特性を持つはずです。
5. 同じサブ領域内のピクセルは接続されている必要があります。
最初に、画像エッジの概念を紹介します.物理的形状、幾何学的特性、材料特性、オブジェクトの反射係数、背景、および自然シーンの領域の違いにより、画像のグレーレベルが突然変化し、違いが形成されます画像 エリア。画像の端とは、画像内のある領域の終わりと別の領域の始まりを意味します。、つまり、2 つの隣接する領域間のピクセル ジオメトリがイメージのエッジを構成します。画像のエッジの特徴は、エッジを通過するときに 2 つのグレー レベルが大幅に変化することです。
理想的なステップチェンジは左側に示されていますが、実際にはほとんどが右側にあります
エッジベースの画像セグメンテーション方法では、最初のステップは、画像内のエッジ情報を決定し、それらを境界として接続することです。
ハフ変換に基づくエッジ検出アルゴリズム
実際には、次の図に示すように、極座標を使用して直線を表すことがよくあります。
極座標を使用して XY 座標で直線を表すことは、実際には、XY 空間の直線を極座標の一連の曲線の交点に対応させることと同じです. 次の図は、これを非常によく示しています.
画像内の直線を抽出する方法については、詳細には触れませんが、関連する画像処理の本を参照して、実装プロセスと使用される 2 つの重要な機能について簡単に説明できます。
実装プロセス:
最初に直線のエッジがキャニー演算子によって取得され、次に画像内の直線エッジの座標がハフ変換によって取得され、最後に座標に従って描画されます。
キャニー関数:
cv.キャニー( | 画像、しきい値1、しきい値2[、エッジ[、アパーチャサイズ[、L2勾配]]] | ) -> | エッジ |
これは cv でのキャニー関数の使用法です。彼は 6 つのパラメーターを入力する必要があります。
image: 入力が必要な画像データです。
threshold1: これは下限しきい値です
threshold2: これは上限のしきい値です
上記の実際のエッジ特性のグラフを比較すると、これら 2 つのしきい値の間のグレー値が境界と見なされることが理解できます。
アパーチャサイズ: ソーベル オペレータのアパーチャ サイズ。通常、3×3 サイズの畳み込みカーネルが使用されます。
Canny 演算子が最終的に返すのは、バイナリ イメージである元のイメージと同じサイズのエッジ データを格納するマトリックスです。
HoughLinesP() 関数:
cv.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) ->lines
これは cv の HoughLinesP() 関数で、6 つのパラメーターを入力する必要があります。
image: これは、エッジ データ、つまり Canny オペレータによって抽出されたエッジを格納するイメージです。
rho: アキュムレータのピクセル単位の距離分解能。
theta: ラジアン単位のアキュムレータの角度分解能。
しきい値: これはアキュムレータの結果と比較されます。このしきい値より大きいポイントのみが直線と見なされます。
minLineLength: 線の長さの最小値です。線の長さがこの設定された最小の長さより短い場合、直線として認識されません。
maxLineGap: 同じライン上のポイント間の最大許容ギャップ。
HoughLinesP 関数は最終的に、各線分の始点と終点を格納する行列 [x1, y1, x2, y2] を返します。
実装手順は以下の通りで、使用する絵はお絵かきソフトでランダムに描いたものです。
import cv2
import numpy as np
img = cv2.imread('C:\\Users\\yu\\Desktop\\picture_csdn\\lines_test.png', cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img_gray', img_gray)
# Canny边缘检测
img_Canny = cv2.Canny(img_gray, 0, 250, (3, 3))
cv2.imshow('img_canny', img_Canny)
result_HoughLinesP = cv2.HoughLinesP(img_Canny, 1, 1 * np.pi / 180, 10, minLineLength=1, maxLineGap=5)
# 画出检测的线段
for result in result_HoughLinesP:
for x1, y1, x2, y2 in result:
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 255), 2)
cv2.imshow('result', img)
cv2.waitKey(0)
実験画像:
Canny オペレーターによって抽出されたエッジ画像:
描画された最終的な線のイメージ: