我有以下代码用于在二维维度上进行卷积:
matrix = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])kernel = np.array([[1,-1],[1,-1]])kr, kc = kernel.shapemr, mc = matrix.shapeoutput = np.empty((mc-kc+1, mr-kr+1))for row in range(mc-kc+1): for column in range(mr-kr+1): output[row][column] = (matrix[row:row+kr,column:column+kc]*kernel).sum()print(output)
我想尝试在真实的彩色图像上使用它,以下是我尝试的内容
#matrix现在是3Dprint(matrix.shape)Out: (340, 360, 3)#kernel现在是3Dprint(kernel.shape)Out: (34, 36, 3)kr, kc, kdim = kernel.shapemr, mc, mdim = matrix.shapeoutput = np.empty((mc-kc+1, mr-kr+1, 3))for row in range(mc-kc+1): for column in range(mr-kr+1): for dim in range(3): output[row][column][dim] = (matrix[row:row+kr,column:column+kc]*kernel).sum()print(output)Out: ValueError: operands could not be broadcast together with shapes (33,36,3) (34,36,3)
我认为深度维度有问题,但我仍然不知道如何修复它。请帮助我?
回答:
你在output
的声明和行列循环中交换了行和列。试试这个版本:
# 注意: [行, 列, 通道]output = np.empty((mr - kr + 1, mc - kc + 1, 3))# 注意: `row`循环遍历矩阵的行,`column`循环遍历列for row in range(mr - kr + 1): for column in range(mc - kc + 1): for dim in range(3): output[row][column][dim] = (matrix[row:row + kr, column:column + kc] * kernel).sum()print(output)