Python 如何将矩阵应用于图像
我做了一些搜索,但没有找到完全相同的问题——我找到的解决方案也不适用 我有一个图像,由形状Python 如何将矩阵应用于图像,python,image,numpy,matrix,basis,Python,Image,Numpy,Matrix,Basis,我做了一些搜索,但没有找到完全相同的问题——我找到的解决方案也不适用 我有一个图像,由形状(l1,l2,3) 其中l1,l2为整数,3为RGB 出于某些原因,我想改变基础,这意味着对所有的RGB向量应用一个矩阵p。请注意,P的形状为(3,3) 我写了这样一篇文章: def change_base(Image,P): Image_copie=np.zeros(Image.shape) for i in range(Image_copie.shape[0]): fo
(l1,l2,3)
其中l1,l2为整数,3为RGB
出于某些原因,我想改变基础,这意味着对所有的RGB向量应用一个矩阵p。请注意,P
的形状为(3,3)
我写了这样一篇文章:
def change_base(Image,P):
Image_copie=np.zeros(Image.shape)
for i in range(Image_copie.shape[0]):
for j in range(Image_copie.shape[1]):
Image_copie[i,j]=np.dot(P,Image[i,j])
return Image_copie
很明显,它是有效的,但是它很难看而且速度非常慢
你们有什么解决办法吗,也许用numpy?我不使用opencv
谢谢 您正在缩小两个输入
Image
和p
上的最后一个轴。所以,你可以用,像这样-
np.tensordot(Image,P,axes=(-1,-1))
Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
np.einsum('ijk,lk->ijl',Image,P)
这也可以表示为np.dot
,前后进行一些重塑,如下所示-
np.tensordot(Image,P,axes=(-1,-1))
Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
np.einsum('ijk,lk->ijl',Image,P)
也可以用于这样的缩减操作,如下所示-
np.tensordot(Image,P,axes=(-1,-1))
Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
np.einsum('ijk,lk->ijl',Image,P)
就性能而言,作为一种单独的缩减操作,没有轴对齐要求,基于点的
解决方案对于大型阵列会更快,但对于小型到像样大小的阵列,einsum
可能会更好
运行时测试
案例1:
案例2:
这是一个3x3矩阵,一个变基矩阵。那么,发布的解决方案对你有用吗?