Я новичок в OpenCV, и я пытаюсь получить пиксели круга из изображения.
Например, я рисую круг на случайном изображении:
import cv2
raw_img = cv2.imread('sample_picture.png')
x = 50
y = 50
rad = 20
cv2.circle(raw_img,(x,y),rad,(0,255,0),-1)
cv2.imshow('output', raw_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
На выходе отображается изображение с кружком. Однако я хочу вернуть все пиксели на круге в виде массива. Есть какой-либо способ сделать это? Я знаю, что могу получить приблизительные координаты из формулы круга, но это потребует большого количества десятичных вычислений, и я почти уверен, что функция cv2.circle () уже вычислила пиксель, так что есть способ получить его из сама функция вместо того, чтобы рассчитывать себя?
Кроме того, если это возможно, я хотел бы получить пиксель эллипса, используя cv2.ellipse () обратно в качестве массива координат. Но на этот раз я хочу получить пиксель только из части эллипса (от определенного угла до другого угла, который я могу указать в параметре cv2.ellipse ()).
Спасибо.





Вы можете достичь того, что ищете, используя функцию numpy:
numpy.where(condition[, x, y])
Подробное объяснение функции по ссылке: https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.where.html
В вашем случае вы хотите, чтобы он возвращал координаты с ненулевыми значениями. Используя этот метод, вы можете нарисовать что угодно в пустом массиве, и он вернет все строки и столбцы, соответствующие ненулевым значениям.
Он вернет индекс массива, который удовлетворяет заданному вами условию. Ниже приведен код, показывающий пример использования.
import cv2
import numpy as np
raw_img = cv2.imread('sample_picture.png')
x = 50
y = 50
rad = 20
cv2.circle(raw_img,(x,y),rad,(0,255,0),-1)
# Here is where you can obtain the coordinate you are looking for
combined = raw_img[:,:,0] + raw_img[:,:,1] + raw_img[:,:,2]
rows, cols, channel = np.where(combined > 0)
cv2.imshow('output', raw_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
извините, я исправлю код, чтобы включить цвет
Ваш метод не работает для цветных изображений. Но, используя ваш метод, я понял, что могу создать маску с нулевыми значениями, а затем использовать cv2.circle () для ее рисования. Затем я могу использовать функцию np.where (), чтобы найти координаты! Спасибо, в любом случае!