【问题标题】:What's the easiest way to find the coordinates of an object in a image?在图像中查找对象坐标的最简单方法是什么?
【发布时间】:2019-04-26 10:28:34
【问题描述】:

想象一下,在一种颜色的背景上具有不同颜色的圆圈图像。找到圆心坐标的最简单方法是什么(当然以编程方式)?

【问题讨论】:

  • 圆圈是否相互重叠?它们可以同心吗?您的图像是 JPEG 还是 PNG 或其他?你使用什么操作系统?你可以用什么语言编程?你试过什么?每个圆圈都只有一种纯色吗?圆圈是否完全包含在图像中,或者某些部分是否位于背景之外?
  • 它们不重叠也不同心。图像的格式可以是任何有助于该过程的格式。 Windows 和 Linux 都可以。只有 C 和一点点 Java,但我现在正在练习 Python。我是一个初学者,正在研究我想出的一个项目,所以除了谷歌之外我什么都没试过。圆圈是纯色的,它们永远不会落在图像之外。

标签: image api object coordinates analysis


【解决方案1】:

我也想在 Python 中使用 OpenCV 执行此操作,使用与我的其他答案相同的起始图像。

代码如下:

#!/usr/bin/env python3

import numpy as np
import cv2

# Load image
im = cv2.imread('start.png')

# Convert to grayscale and threshold
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,1,255,0)

# Find contours, draw on image and save
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(im, contours, -1, (0,255,0), 3)
cv2.imwrite('result.png',im)

# Show user what we found
for cnt in contours:
   (x,y),radius = cv2.minEnclosingCircle(cnt)
   center = (int(x),int(y))
   radius = int(radius)
   print('Contour: centre {},{}, radius {}'.format(x,y,radius))

这在终端上给出了这个:

Contour: centre 400.0,200.0, radius 10
Contour: centre 500.0,200.0, radius 80
Contour: centre 200.0,150.0, radius 90
Contour: centre 50.0,50.0, radius 40

这是结果图像:

【讨论】:

  • 这实际上是非常详细和有用的!非常感谢您的回答,非常感谢!
【解决方案2】:

ImageMagick 有一个非常简单的方法,它是免费的,可以安装在大多数 Linux 发行版上,并且可用于 macOS 和 Windows - 无需编程!

让我们从这张图片开始:

现在您只需在终端或命令提示符中运行它:

magick input.png -define connected-components:verbose=true -connected-components 8 -auto-level output.png

输出

Objects (id: bounding-box centroid area mean-color):
  0: 600x300+0+0 297.4,145.3 128391 srgb(0,0,0)          <--- black background
  2: 181x181+110+60 200.0,150.0 25741 srgb(0,0,255)      <--- blue circle
  3: 161x161+420+120 500.0,200.0 20353 srgb(255,0,255)   <--- magenta circle
  1: 81x81+10+10 50.0,50.0 5166 srgb(0,255,0)            <--- green circle
  4: 21x21+390+190 400.0,200.0 349 srgb(255,255,0).      <--- yellow circle

我在&lt;---之后添加了上面的cmets。

查看蓝色圆圈,您可以看到它的颜色是 srgb(0,0,255),它是蓝色的,尺寸为 181x181 像素 - 所以它的半径是 90 像素。包含矩形的左上角位于[110,60],因此中心位于[200,150],与为质心提供的200.00,150.00 匹配。

同样,看黄色圆圈,它的颜色是黄色的 srgb(255,255,0)。它的高度和宽度为 21 像素,即半径为 10。包含正方形的左上角位于[390,190],即中心位于[400,200],与给出的质心 400.0,200.0 匹配。

【讨论】:

  • @fmw42 这就是我写的,不是吗?反正我就是这个意思!谢谢。
  • 我删除了我的评论,马克,当我看到你问同样的事情时。但是为了 OP 的利益,您可以展示如何仅提取除黑色背景之外的颜色和质心作为答案的补充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多