Я начал с набора точек лазерного сканирования, которые я построил как график рассеяния, используя matplotlib.Затем я использовал plt.savefig, чтобы открыть график как изображение и использовать openCV, чтобы найти контуры вокруг точек.Теперь я хочу найти центры контуров и построить их в виде точек на исходном графике рассеяния.Проблема в том, что я не знаю, как создать отображение между точками исходного точечного графика и пикселями изображения.Есть ли способ сделать это?Или другой способ пометить центр контуров в matplotlib?
Примечание: причина, по которой мне нужно рисовать контуры, заключается в том, что позже мне нужно использовать функцию matchShapes openCV для сравнения контуров.
Здесьизображения с каждого шага:
график рассеяния
,
контуры с центрами, отмеченными красным
Теперь я хочу добавить красную маркировку на изображении на график рассеяния.
Вот мой код:
plt.scatter(X[:,0], X[:,1], s=2)
plt.axis('equal')
plt.axis('off')
plt.savefig(name)
plt.clf()
img = cv2.imread(name)
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgGray, 127, 255, 0)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
height = img.shape[0]
width = img.shape[1]
blank_image = np.zeros((height,width,3), np.uint8)
cv2.drawContours(blank_image, contours, -1, (255,0,0))
for contour in contours:
M = cv2.moments(contour)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
cv2.circle(blank_image, (cX, cY), 2, (0, 0, 255), -1)
cv2.imwrite(name, blank_image)
ОБНОВЛЕНИЕ: Основываясь на предложениях, я посмотрел на функцию преобразования matplot и попробовал следующее:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x_coords, y_coords, 'bo', markersize=2)
ax.axis('equal')
ax.axis('off')
height1 = fig.get_figheight()*fig.dpi
width1 = fig.get_figwidth()*fig.dpi
inv = ax.transData.inverted()
plt.savefig('img.png')
img = cv2.imread('img.png')
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgGray, 127, 255, 0)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
height = img.shape[0]
width = img.shape[1]
blank_image = np.zeros((height,width,3), np.uint8)
centers_x = []
centers_y = []
for contour in contours:
M = cv2.moments(contour)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
centers_x.append(inv.transform((cX, height1-cY))[0])
centers_y.append(inv.transform((cX, height1-cY))[1])
cv2.drawContours(blank_image, [contour], -1, (255,0,0),1)
cv2.circle(blank_image, (cX, cY), 2, (0, 0, 255), -1)
cv2.imwrite("test.png", blank_image)
ax.plot(centers_x, centers_y, 'ro', markersize=4)
plt.show()
Это дало мне близко, нокажется, что координаты х все еще немного не совпадают
новый результат]
.
Я также пытался
centers_x.append(inv.transform((width1-cX, height1-cY))[0])
centers_y.append(inv.transform((width1-cX, height1-cY))[1])
, но это такжене работает.
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: добавление
plt.tight_layout()
решило проблему.