Какой самый простой способ найти координаты объекта на изображении? - PullRequest
0 голосов
/ 24 ноября 2018

Представьте себе изображение кругов разных цветов на фоне одного цвета.Какой самый простой способ найти координаты центров окружностей (конечно, программно )?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Мне тоже хотелось сделать это в Python с OpenCV, используя то же самое начальное изображение, что и в моем другом ответе.

enter image description here

Код выглядит такthis:

#!/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

И это как результат изображения:

enter image description here

0 голосов
/ 25 ноября 2018

Существует очень простой способ с ImageMagick , который бесплатен и устанавливается на большинство дистрибутивов Linux и доступен для macOS и Windows - программирование не требуется!

Давайте начнем с этого образа:

enter image description here

Теперь вы просто запустите это в терминале или командной строке:

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

Я добавил комментарии выше после <---.

Глядя на синий круг, вы можете видеть его цвет 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...