我有:
print(self.L.T.shape)
print(self.M.T.shape)
(8, 3)
(8, 9082318)
self.N = np.linalg.lstsq(self.L.T, self.M.T, rcond=None)[0].T
可以正常工作并返回
(9082318, 3)
但是
我想对M执行某种排序,并且仅对M的最佳8-n值计算解。 或者忽略低于和/或高于特定值的M值。
任何有关如何做到这一点的指针将不胜感激。 谢谢。
试图准确复制this solution,但返回错误
原始工作功能,但基本上只是一行。 M是8幅经过重塑的灰度图像的堆栈。 L是8个光方向向量的堆栈。
M包含阴影,但并不总是在图像中的同一位置。 因此,我需要从计算中删除那些像素,但L必须保留其尺寸。
def _solve_l2(self):
"""
Lambertian Photometric stereo based on least-squares
Woodham 1980
:return: None
Compute surface normal : numpy array of surface normal (p \times 3)
"""
self.N = np.linalg.lstsq(self.L.T, M.T, rcond=None)[0].T
print(self.N.shape)
self.N = normalize(self.N, axis=1) # normalize to account for diffuse reflectance
这是从链接借来的代码,用于尝试解决此问题: 以前使用的L和M
Ma = self.M.copy()
thresh = 300
Ma[self.M <= thresh] = 0
Ma[self.M > thresh] = 1
Ma = Ma.T
self.M = self.M.T
self.L = self.L.T
print(self.L.shape)
print(self.M.shape)
print(Ma.shape)
A = self.L
B = self.M
M = Ma #http://alexhwilliams.info/itsneuronalblog/2018/02/26/censored-lstsq/
# else solve via tensor representation
rhs = np.dot(A.T, M * B).T[:,:,None] # n x r x 1 tensor
T = np.matmul(A.T[None,:,:], M.T[:,:,None] * A[None,:,:]) # n x r x r tensor
self.N = np.squeeze(np.linalg.solve(T, rhs)).T # transpose to get r x n
返回
numpy.linalg.LinAlgError: Singular matrix