如何将numpy.ndarray的列表(每个numpy.ndarray是1 * 3向量)整形为2-D矩阵,以表示为图像?

时间:2019-05-05 10:25:58

标签: python-3.x numpy image-processing

我正在从事基本的图像处理任务-给定矩阵转换公式,以执行基于像素的矩阵操作。我正在从图像中的(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)

3 个答案:

答案 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)

  • 在二维图像上申请循环

    • rgb =从所有通道中选择像素值
    • ycc =应用矩阵op
    • U [i,j,:] = ycc