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矩阵,一个变基矩阵。那么,发布的解决方案对你有用吗?