如何测量图像中每个极点的长度(以像素为单位)

时间:2018-10-18 02:04:22

标签: c++ image opencv python-imaging-library

我想测量每个单独的极点的高度和宽度(以像素为单位)。 但是因为两极并不总是直立的,但是我需要两极与水平地面的高度。有人可以指导我如何处理吗?

注意:以后可能需要弄清楚它倾斜的角度。不知道我可以在这里问这么多问题。但是,如果有人可以提供帮助,请多加赞赏。

我的图像样本位于以下链接:

Sample Image of poles

1 个答案:

答案 0 :(得分:1)

这应该给您一个很好的主意:

#!/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 ++进行操作,因此您可能根本不愿编写任何代码-在这种情况下,您可以简单地使用大多数Linux中随附的 ImageMagick 发行版,可用于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)中看到它。

因此,如果我们看最后一行,则它是一个134像素宽和154像素高的斑点,从左上角的x = 841和y = 334开始,即,它对应于第一个轮廓 OpenCV 找到的。