Построение пикселей и контуров, когда известны координаты XY - PullRequest
0 голосов
/ 12 февраля 2020

Я использую Open CV в python, и я извлек некоторые точки из тестовой операции контура и точечного полигона. (Я в основном использовал тест pointpolygon, чтобы проверить, находятся ли некоторые пиксели внутри контура или нет). Теперь я получил очки, но я хочу визуально подтвердить, находятся ли мои точки на самом деле внутри контура или нет. Как go об этом? В идеале я хочу сначала нарисовать контур, а затем нанести выделенные пиксели. Я могу нарисовать контур, используя функции drawcontours, но для построения этих точек единственный способ, которым я знаю, это plt.scatter, который больше использует matplotlib вместо opencv.

Может быть что-то принципиально неправильное в том, как я к этому подхожу, потому что такое чувство, что должен быть более простой способ сделать это, которого я скучаю. Вот фрагмент кода того, что у меня есть для справки.

Редактировать : По предложению Марка Сетчелла добавлен фрагмент кода, где я использую изображение [x, y], чтобы установить цвет для определенного пикселя. Тем не менее, (x, y) является декартовой координатой в моем случае, и она не работает, если я задаю ее как пиксельную координату изображения.

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('ti.png',1)
plt.imshow(img)

ret, thresh = cv2.threshold(img, 250, 300, cv2.THRESH_BINARY_INV)

greySrc = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
laplacianSrc= cv2.Laplacian(greySrc, cv2.CV_8U, greySrc, ksize = 5)
contours, hierarchy=cv2.findContours(laplacianSrc, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


indices = np.where(img!= [0])
coordinates = zip(indices[0], indices[1])
pts=list(coordinates)

in_or_out=[cv2.pointPolygonTest(contours[0],point,measureDist=False) for point in pts]
pts_ins_ctr=[x for x, y in zip(pts, in_or_out) if y == 1]
xi=[pts_ins_ctr[i][0] for i in range(len(pts_ins_ctr))]
yi=[pts_ins_ctr[i][1] for i in range(len(pts_ins_ctr))]

img[np.array(pts_ins_ctr)]=np.array([255,0,0],dtype=np.uint8)
plt.imshow(img)

Входное изображение enter image description here

выходное изображение enter image description here

1 Ответ

1 голос
/ 12 февраля 2020

Этот решает это. Спасибо @ MarkSetchell

for pts in pts_ins_ctr:
    img[tuple(reversed(pts))]=[255,0,0]

Две вещи, которые сработали

  1. Назначение цвета в l oop вместо попытки назначить все сразу.
  2. im [y, x] = pix_color (Как отмечено комментарием)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...