Это должно дать вам хорошее представление о том, как это сделать:
#!/usr/local/bin/python3
import cv2
# Open image in greyscale mode
img = cv2.imread('poles.png',cv2.IMREAD_GRAYSCALE)
# Threshold image to pure black and white AND INVERT because findContours looks for WHITE objects on black background
_, thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
# Find contours
_, contours, _ = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# Print the contours
for c in contours:
x,y,w,h = cv2.boundingRect(c)
print(x,y,w,h)
Вывод такой: каждая строка соответствует одной вертикальной полосе на вашем изображении:
841 334 134 154 <--- bar 6 is 154 pixels tall
190 148 93 340 <--- bar 2 is 340 pixels tall
502 79 93 409 <--- bar 4 is 409 pixels tall
633 55 169 433 <--- bar 5 is 433 pixels tall
1009 48 93 440 <--- bar 7 is 490 pixels tall
348 48 93 440 <--- bar 3 is 440 pixels tall
46 46 93 442 <--- bar 1 is 442 pixels tall (leftmost bar)
Первый столбец - это расстояние от левого края изображения, а последний - высота столбца в пикселях.
Поскольку вы не уверены, хотите ли вы сделать это в Python или C ++вы можете вообще не писать никакого кода - в этом случае вы можете просто использовать ImageMagick , который включен в большинство дистрибутивов Linux и доступен для macOS и Windows.
В основном вы используете «Подключенный компонент» анализ, введя это в Терминал:
convert poles.png -colorspace gray -threshold 50% \
-define connected-components:verbose=true \
-connected-components 8 null:
Выход
Objects (id: bounding-box centroid area mean-color):
0: 1270x488+0+0 697.8,216.0 372566 srgb(255,255,255)
1: 93x442+46+46 92.0,266.5 41106 srgb(0,0,0)
2: 93x440+348+48 394.0,267.5 40920 srgb(0,0,0)
3: 93x440+1009+48 1055.0,267.5 40920 srgb(0,0,0)
4: 169x433+633+55 717.3,271.0 40269 srgb(0,0,0)
5: 93x409+502+79 548.0,283.0 38037 srgb(0,0,0)
6: 93x340+190+148 236.0,317.5 31620 srgb(0,0,0)
7: 134x154+841+334 907.4,410.5 14322 srgb(0,0,0)
Это дает вам строку заголовка, котораяскажет вам, что такое все поля, затем строку для каждого из сгустков, найденных на изображении.Не обращайте внимания на первое, потому что это белый фон - вы можете видеть это из последнего поля, которое rgb(255,255,255)
.
Итак, если мы посмотрим на последнюю строку, то это BLOB-объект шириной 134 пикселя и высотой 154 пикселя, начиная с x = 841 и y = 334 в верхнем левом углу, то есть он соответствуетпервый контур, который OpenCV найден.