如何将矩阵应用于imag

2024-04-26 13:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一些搜索,但没有找到完全相同的问题-而且我找到的解决方案不适用。在

我有一个图像,由一个numpy数组表示(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

很明显,它是有效的,但它又丑又慢。在

你们有什么解决办法吗,也许用纽比?我不使用opencv。。!在

谢谢!在


Tags: in图像imagenumpyl1fornprange
1条回答
网友
1楼 · 发布于 2024-04-26 13:17:44

您正在缩小两个输入ImageP上的最后一个轴。所以,你可以使用^{},就像这样-

np.tensordot(Image,P,axes=(-1,-1))

这也可以表示为np.dot,在它之前和之后进行一些重塑,比如-

^{pr2}$

也可以使用^{}来进行这样的还原操作,如-

np.einsum('ijk,lk->ijl',Image,P)

对于性能而言,作为一个单独的缩减操作,没有轴对齐要求,dot-based解决方案对于大型数组会更快,但是对于小到合适大小的数组,einsum可能更好。在

运行时测试

案例1:

In [46]: # Inputs
    ...: Image = np.random.randint(0,255,(256,256,3))
    ...: P = np.random.randint(0,255,(3,3))
    ...: 

In [47]: %timeit change_base(Image,P)
    ...: %timeit np.tensordot(Image,P,axes=(-1,-1))
    ...: %timeit Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
    ...: %timeit np.einsum('ijk,lk->ijl',Image,P)
    ...: 
1 loops, best of 3: 206 ms per loop
100 loops, best of 3: 3.28 ms per loop
100 loops, best of 3: 3.22 ms per loop
100 loops, best of 3: 3.06 ms per loop

案例2:

In [48]: # Inputs
    ...: Image = np.random.randint(0,255,(512,512,3))
    ...: P = np.random.randint(0,255,(3,3))
    ...: 

In [49]: %timeit change_base(Image,P)
    ...: %timeit np.tensordot(Image,P,axes=(-1,-1))
    ...: %timeit Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,))
    ...: %timeit np.einsum('ijk,lk->ijl',Image,P)
    ...: 
1 loops, best of 3: 845 ms per loop
100 loops, best of 3: 12.8 ms per loop
100 loops, best of 3: 12.7 ms per loop
100 loops, best of 3: 13.4 ms per loop

相关问题 更多 >