本記事では、PythonとOpenCVを使って、画像内に存在する細長い物体を検出し、その厚さと長さを推定する方法について詳しく解説します。対象物体には一定の細長さ(長さと厚さに大きな比率)を持つことを前提とし、輪郭検出、最小外接矩形、そして画像上への可視化の処理までを一貫して実施します。
〇必要なライブラリのインポート
import cv2
import matplotlib.pyplot as plt
このコードでは、画像処理のライブラリであるOpenCV(cv2)と、可視化のためのmatplotlib.pyplotを使用しています。OpenCVは画像処理において非常に強力なツールセットであり、matplotlibはPythonでのグラフ描画や画像表示に適しています。
〇画像の読み込みと前処理
aimg = cv2.imread("/content/画像3.png")
img = cv2.cvtColor(aimg,cv2.COLOR_BGR2GRAY)
img = cv2.GaussianBlur(img,(5,5),0)
img = cv2.Canny(img,50,150)
cv2.imread: 対象の画像(ここでは「画像3.png」)をカラー画像として読み込みます。
〇輪郭検出
img,_ =
cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.findContours: Cannyで得られたエッジ画像から輪郭(Contour)を検出します。
pp = 3
rr = []
qq = []
for ii in img:
aa
= cv2.minAreaRect(ii)
(x,y),(w,h),ag = aa
if
max(w,h)/min(w,h) >1.5 :
rr.append((int(x),int(y)))
print(f"厚さ{round(min(w,h)/pp,2)}㎜ 長さ{round(max(w,h)/pp,2)}㎜")
cv2.minAreaRect(ii): 各輪郭に最小外接矩形(最小面積で回転も許す長方形)をあてはめます。返り値は中心座標(x, y)、幅と高さ(w, h)、および回転角(ag)です。
〇可視化:対象物に赤い枠を描画
for dd in rr:
x, y = dd
w, h = 60,20 # 四角の大きさ
top_left = (x - w // 2, y - h // 2)
bottom_right = (x + w // 2, y + h // 2)
このブロックでは、検出された細長い物体の中心座標(x, y)を基準に、60×20ピクセルの赤い長方形を描画しています。
〇結果の表示
plt.imshow(cv2.cvtColor(aimg,
cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.show()
OpenCVの画像(BGR形式)をmatplotlibで正しく表示するために、cv2.COLOR_BGR2RGBで色空間を変換し、軸を非表示にして画像のみを表示しています。
〇出力例と応用
このコードを実行すると、以下のような結果が得られます:
このコードはシンプルで効果的ですが、いくつかの改良も考えられます:
現在はpp = 3でスケーリングしていますが、画像内にスケールバーがある場合は自動的に測定することが理想です。
現在は単純な長方形を描いていますが、cv2.boxPoints()を使えば回転を考慮した矩形が描画できます。
cv2.putText()で物体のサイズを枠の横に描画することで、さらに直感的な表示が可能です。
フォルダ内の全画像にこの処理を適用することで、バッチ処理も実現可能です。
〇まとめ
本記事では、OpenCVを使って画像内の細長い物体を検出し、寸法を推定・可視化するPythonスクリプトを詳しく解説しました。
0 件のコメント:
コメントを投稿