不同形状的矩阵乘法

问题描述 投票:0回答:1

我的目标是使用 Python 对表示图像的矩阵进行多次转换。特别是,我希望通过矩阵乘法来实现转换。我坚持后者,因为我目前正在向我的学生教授矩阵,而我在这里提出的问题与我想与他们一起做的一个关于矩阵的可能用途的小型项目有关。因此我希望他们使用矩阵乘法。

这是我想做的一个例子。我们看下面的矩阵,它的元素代表一个像素(此时矩阵的元素是0(代表黑色)到255(代表白色)之间的整数,所以它是一个灰度图像):

image_gray = [
    [0,200,3,48],
    [30,155,255,7],
    [1,218,92,111],
    [175,123,67,6]
]

我们还考虑以下“交换矩阵”:

swapmat = [
    [0,0,0,1],
    [0,1,0,0],
    [0,0,1,0],
    [1,0,0,0]
]

从数学上讲,进行矩阵乘法 image1 x swapmat 将得到与 image1 相同的矩阵,但交换了第 1 列和第 4 列。 为了在Python中进行这样的乘法,我想到使用

numpy.matmul(image_gray,swapmat)
,而且效果很好。 然而,最终,我希望能够处理任何图像,其像素不仅由整数值描述,而且由代表 RGB 值的三元组描述。例如,这样的图像是:

image_rgb = [
    [[12, 50, 201], [34, 120, 55], [255, 0, 0], [3,4,5]],
    [[0, 255, 0], [100, 100, 100], [50, 50, 50], [1,2,3]],
    [[0, 0, 255], [20, 30, 40], [100, 200, 250],[60,75,98]],  
    [[0, 4, 25], [23, 37, 46], [30, 240, 232],[6,7,8]]
]

现在,我不能使用

numpy.matmul(image_rgb,swapmat)
,因为
image_rgb
的形状现在是(4,4,3)而不是(4,4)。 你会如何在 Python 中以正确的方式做到这一点?

我还必须提到,我希望代码运行得相当“快”。我的最终目标是拍摄一个合理大小的随机图像(例如,(1024,1024,3)),对其应用大约 100 行/列交换以解构图像,学生的目标是以相反的顺序应用所有变换以恢复原始图像。因此,这应该在普通笔记本电脑上运行几秒钟。

python image matrix dimensions
1个回答
0
投票

根据 documentation,超过 2 维的

np.matmul
参数被视为驻留在最后两个索引中的矩阵堆栈。因此,您只需移动图像矩阵的轴以使颜色通道成为第一个通道,然后进行矩阵乘法并将轴向后移动:

image_rgb_moved = np.moveaxis(image_rgb, -1, 0)
swapped_moved = np.matmul(image_rgb_moved, swapmat)
swapped = np.moveaxis(swapped_moved, 0, -1)
© www.soinside.com 2019 - 2024. All rights reserved.