輪郭抽出した木の幹の内部を255で塗りつぶしたマスク画像を作成して、画像の各 x ごとに縦方向に255の画素を数えて、それが一番大きい値を探せばいいと思います。
python
1import cv2
2import numpy as np
3from matplotlib import pyplot as plt
4
5img = cv2.imread("sample.jpeg")
6
7gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
8
9ret, bin_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
10
11contours, hierarchy = cv2.findContours(
12 bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
13)
14
15# 一番大きい輪郭を取得
16contour = max(contours, key=lambda x: cv2.contourArea(x))
17
18# 輪郭の中を塗りつぶす
19cv2.drawContours(bin_img, [contour], -1, 255, -1)
20
21# y 方向に見ていき、白の画素を数える
22widths = (bin_img == 255).sum(axis=0)
23max_width = widths.max()
24
25print(f"最大の太さ: {max_width}px")
26
27# 可視化
28h, w = img.shape[:2]
29fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 6), sharex=True)
30ax1.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
31ax2.plot(np.arange(w), widths)
32
33ax2.set_ylim(0, h)
34ax1.set_ylabel("y")
35ax2.set_xlabel("x")
36ax2.set_ylabel("width")
37ax2.grid()
38plt.show()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/12 01:31
2020/08/12 04:27 編集
2020/08/14 04:18