Как измерить длину (в пикселях) для каждого полюса на изображении - PullRequest
0 голосов
/ 18 октября 2018

Я хочу измерить высоту и ширину каждого полюса в пикселях.Но потому что полюса не всегда стоят прямо, но мне нужна высота столба от горизонтальной поверхности.Кто-нибудь может подсказать мне, как с этим справиться?

Примечание: мне, возможно, понадобится узнать угол, который он наклонил позже.Не уверен, что могу задать так много вопросов здесь.Но очень ценю, если кто-то может помочь.

Образец изображения, который у меня есть, находится по ссылке ниже:

Sample Image of poles

1 Ответ

0 голосов
/ 22 октября 2018

Это должно дать вам хорошее представление о том, как это сделать:

#!/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 найден.

...