У меня есть код, который вычисляет ориентацию фигуры, и функция, которая выпрямляет фигуру на основе рассчитанной ориентации. Когда я запускаю код, ориентация кажется хорошей, но когда функция пытается выправить фигуру, создается впечатление, что фигура приобрела другую форму. Может ли быть что-то не так в коде?
Код:
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('path_to_input_image',0)
edges = cv2.Canny(img,1,2,70,3)
img = edges
y, x = np.nonzero(img)
x = x - np.mean(x)
y = y - np.mean(y)
coords = np.vstack([x, y])
cov = np.cov(coords)
evals, evecs = np.linalg.eig(cov)
sort_indices = np.argsort(evals)[::-1]
x_v1, y_v1 = evecs[:, sort_indices[0]]
x_v2, y_v2 = evecs[:, sort_indices[1]]
scale = 30
plt.plot([x_v1*-scale*2, x_v1*scale*2],
[y_v1*-scale*2, y_v1*scale*2], color='red')
plt.plot([x_v2*-scale, x_v2*scale],
[y_v2*-scale, y_v2*scale], color='blue')
plt.plot(x, y, 'k.')
plt.axis('equal')
plt.gca().invert_yaxis()
plt.show()
def rechtzetten(x_v1,y_v1,coords):
theta = np.arctan((x_v1)/(y_v1))
rotation_mat =np.matrix([[np.cos(theta), -np.sin(theta)],[np.sin(theta),np.cos(theta)]])
transformed_mat = rotation_mat*coords
x_transformed, y_transformed = transformed_mat.A
fig = plt.figure()
ax = plt.Axes(fig, [0.,0.,1.,1.])
ax.set_axis_off()
fig.add_axes(ax)
ax = plt.plot(x_transformed,y_transformed)
plt.savefig("ja.png",pdi=300)
plt.show(ax)
#plt.savefig("rotation.png")
img3 = cv2.imread('ja.png',100)
edges2 = cv2.Canny(img3,1,4)
cv2.imwrite('rotated_with_border.png', edges2)
return transformed_mat, edges2
transformed_mat, edges = rechtzetten(x_v1,y_v1,coords)
Я использовал входное изображение:
Выходные данные, которые я получаю:
На первом рисунке выходов показана ориентация с использованием синей и красной оси. Вторая фигура выходных данных должна быть выпрямленной версией первой фигуры.
* Под выпрямлением я подразумеваю совмещение синей и красной осей на первой фигуре с осями x и y в базовой системе координат. .