Расчет ориентации фигуры, чтобы выправить ее (в питоне) - PullRequest
1 голос
/ 23 декабря 2019

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

Код:

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)

Я использовал входное изображение:

enter image description here

Выходные данные, которые я получаю:

enter image description here

На первом рисунке выходов показана ориентация с использованием синей и красной оси. Вторая фигура выходных данных должна быть выпрямленной версией первой фигуры.

* Под выпрямлением я подразумеваю совмещение синей и красной осей на первой фигуре с осями x и y в базовой системе координат. .

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