我正在从事基本的图像处理任务-给定矩阵转换公式,以执行基于像素的矩阵操作。我正在从图像中的(x,y)像素位置读取像素值(给我一个1 * 3元组),并使用numpy进行矩阵运算,该运算返回numpy.ndarray的值,最后我需要存储转换后的像素值在2d矩阵中,每个(x,y)坐标都存储转换后的像素值的(1 * 3)向量。
def colortrans(im):
#(X,Y,Z) = T + [M](*(RGB)(1*3 Vector)
# (X,Y,X) = (1*3 tuple)
# T = [0,128,128], (a 1*3 vector)
# M = (3*3 Matrix)
# RGB = (1*3 Vector)
pix = im.load()
x,y = im.size
ycc = []
#print(ycc.shape)
m1 = np.array([[0],[128],[128]])
print(type(m1))
m2 = np.array([[0.299,0.587,0.114],[-0.168736,-0.331264,0.5],[0.5,-0.418688,-0.081312]])
print(m2)
for i in range(x):
for j in range(y):
m = m1.T+np.dot(m2,np.array(pix[i,j]))
#print(m.shape)
#print(type(m))
ycc.append(m)
#ycc=np.array(ycc)
print(ycc[1:5])
mat_ycc = np.reshape(ycc,(x,y))
print(len(ycc))
print (x, y)
mat_ycc = np.reshape(ycc,(x,y))
return mat_ycc
[(180,128,128),(167,128,128) ... ]
[array([[180., 128., 128.]]), array([[167., 128., 128.]]), array([[157., 128., 128.]]), array([[178.772 , 127. , 128.162624]])]
len(ycc) = 409600
Image size = 640*640
我得到的错误是:
ValueError:无法将大小为1228800的数组重塑为形状(640,640)
答案 0 :(得分:1)
您使用像素计数,但是每个像素由3个值组成,因此您应该使用
mat_ycc = np.reshape(ycc,(x,y,3)) # note the ,3 part
答案 1 :(得分:0)
您的方法可行,但方法太复杂。您为什么不使用blockproc作为小帮手(因为我在同一堂课中就知道这一点)?您可以编写一个简单的函数,将一个像素从RGB转换为YCbCr,然后使用所述助手在矩阵上进行迭代。
your_matrix = blockproc(your_matrix, (1,3), your_color_transformation)
您还可以通过numpy.zeros(size)
创建一个单独的矩阵,然后将解决方案写入正确的位置。您可以在这里使用(Y,Cb,Cr)
三元组。从图像中取出每个元素并分别进行处理,创建一个三元组并将其写入正确的位置。
答案 2 :(得分:-1)
我认为您正在遵循一些复杂的方法。 我没有什么建议:
创建一个U = np.zeroes(x,y,3)
在二维图像上申请循环