前提
python独学で学習し始めの初心者です。
openCVを用いて輪郭の大まかな抽出(等間隔かつ特徴点を拾う)方法を模索しています。
現時点では輪郭の近似が終わり、そのうえでの点間の距離が等間隔とは程遠いため、考えている方法として、各点間の距離を測り一番距離が短いものの決定、かつその距離を基準に点間の距離が長い部分に点を置きたいと思っているのですが可能であるのか、もし可能ならば、考え方を教えていただきたいです。
実現したいこと
- 輪郭の近似をしつつ点間の距離をほぼ等しくしたい
該当のソースコード
python
1import cv2 2import numpy as np 3from IPython import display 4from matplotlib import pyplot as plt 5from matplotlib import patches 6 7 8def imshow(img, format=".jpg", **kwargs): 9 """ndarray 配列をインラインで Notebook 上に表示する。 10 """ 11 img = cv2.imencode(format, img)[1] 12 img = display.Image(img, **kwargs) 13 display.display(img) 14 15 16def draw_contours(img, contours, ax): 17 """輪郭の点及び線を画像上に描画する。 18 """ 19 ax.imshow(img) 20 ax.set_axis_off() 21 22 for i, cnt in enumerate(contours): 23 # 形状を変更する。(NumPoints, 1, 2) -> (NumPoints, 2) 24 cnt = cnt.squeeze(axis=1) 25 # 輪郭の点同士を結ぶ線を描画する。 26 ax.add_patch(plt.Polygon(cnt, color="b", fill=None, lw=2)) 27 # 輪郭の点を描画する。 28 ax.plot(cnt[:, 0], cnt[:, 1], "ro", mew=3, ms=4) 29 # 輪郭の番号を描画する。 30 #ax.text(cnt[0][0], cnt[0][1], i, color="r", size="20", bbox=dict(fc="w")) 31 32# 画像を読み込む。 33img = cv2.imread("dog.jpg") 34converted = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) 35 36# グレースケールに変換する。 37gray = cv2.cvtColor(converted, cv2.COLOR_BGR2GRAY) 38 39#ネガポジ変換で反転 40gray2 = cv2.bitwise_not(gray) 41 42 43# 2値化する 44ret, bin_img = cv2.threshold(gray2, 150, 255, cv2.THRESH_BINARY) 45 46# 輪郭を抽出する。 47contours, hierarchy = cv2.findContours( 48 bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 49) 50 51 52approx_contours = [] 53for i, cnt in enumerate(contours): 54 # 輪郭の周囲の長さを計算する。 55 arclen = cv2.arcLength(cnt, True) 56 # 輪郭を近似する。 57 approx_cnt = cv2.approxPolyDP(cnt, epsilon=10, closed=True) 58 approx_contours.append(approx_cnt) 59 # 元の輪郭及び近似した輪郭の点の数を表示する。 60 print(f"contour {i}: before: {len(cnt)}, after: {len(approx_cnt)}") 61 print(approx_cnt) 62 63 64 65fig, ax = plt.subplots(figsize=(8, 8)) 66draw_contours(converted, approx_contours, ax) 67plt.show()
試したこと
approx_cntで座標が取れているのでユークリッド距離を用いたら、、と思ったのですが座標をどう表すか考え方が足りず断念しました。
現状の画像はこのような感じです。
補足情報(FW/ツールのバージョンなど)
バージョン:python3.10

回答2件
あなたの回答
tips
プレビュー