np.uint8 () делает неправильные вычисления нормальных векторов - PullRequest
0 голосов
/ 06 ноября 2019

Итак, я хотел вычислить нормальные векторы ребер, применяя градиенты к изображению глубины. Когда по какой-то причине я изменил свое матричное изображение с помощью np.uint8 () (# 1-я попытка), нормали движутся в неправильных направлениях, как показано на рисунке ниже. В функции нормалей я использовал ndimage.sobel для вычисления градиентов. Неверные векторы нормалей

Когда я изменил входное изображение из созданной мною реальной матрицы (# 2-я попытка), векторы нормалей рассчитываются правильно, как показано на рисунке. Может кто-нибудь объяснить, почему это так? Правильные нормальные векторы

#1st try
sm_im = np.zeros((100,100))
sm_im[30:-30, 20:-20] = 1
sm_im = nd.rotate(sm_im, 25, mode='constant')
sm_im_copy = np.uint8(sm_im) #HERE IS THE np.uint8
sm_edge_im = cv2.Canny(sm_im_copy, 1, 5)
normals_pm, edge_pm = normals(sm_im_copy, sm_edge_im) #PAY ATTENTION HERE
cv2.imwrite(r'C:\Users\Adam Syammas Zaki P\Documents\Assignment\Grasp Planning\Simulation\Image\simple_debug_edge.png', sm_edge_im)
save_arr = r'C:\Users\Adam Syammas Zaki P\Documents\Assignment\Grasp Planning\Simulation\Image\sm_normal_debug.png'
depth = Image.open(r'C:\Users\Adam Syammas Zaki P\Documents\Assignment\Grasp Planning\Simulation\Image\simple.png')
draw_normals(edge_pm, normals_pm, depth, save_arr)

#2nd try
sm_im = np.zeros((100,100))
sm_im[30:-30, 20:-20] = 1
sm_im = nd.rotate(sm_im, 25, mode='constant') #USING THE ORIGINAL MATRIX
sm_im_copy = np.uint8(sm_im)
sm_edge_im = cv2.Canny(sm_im_copy, 1, 5)
normals_pm, edge_pm = normals(sm_im, sm_edge_im) #PAY ATTENTION HERE
cv2.imwrite(r'C:\Users\Adam Syammas Zaki P\Documents\Assignment\Grasp Planning\Simulation\Image\simple_debug_edge.png', sm_edge_im)
save_arr = r'C:\Users\Adam Syammas Zaki P\Documents\Assignment\Grasp Planning\Simulation\Image\sm_normal_debug.png'
depth = Image.open(r'C:\Users\Adam Syammas Zaki P\Documents\Assignment\Grasp Planning\Simulation\Image\simple.png')
draw_normals(edge_pm, normals_pm, depth, save_arr)
...