【问题标题】:Convert Image ( png ) To Matrix And Then To 1D Array将图像 ( png ) 转换为矩阵,然后转换为一维数组
【发布时间】:2013-03-14 18:58:30
【问题描述】:


我有 5 张图片,我想将每个图像转换为一维数组并将其作为向量放入矩阵中。
我希望能够再次将每个向量转换为图像。

img = Image.open('orig.png').convert('RGBA')
a = np.array(img)

我不熟悉 numpy 的所有功能,想知道是否有其他工具可以使用。
谢谢。

【问题讨论】:

    标签: python image-processing numpy


    【解决方案1】:
    import numpy as np
    from PIL import Image
    
    img = Image.open('orig.png').convert('RGBA')
    arr = np.array(img)
    
    # record the original shape
    shape = arr.shape
    
    # make a 1-dimensional view of arr
    flat_arr = arr.ravel()
    
    # convert it to a matrix
    vector = np.matrix(flat_arr)
    
    # do something to the vector
    vector[:,::10] = 128
    
    # reform a numpy array of the original shape
    arr2 = np.asarray(vector).reshape(shape)
    
    # make a PIL image
    img2 = Image.fromarray(arr2, 'RGBA')
    img2.show()
    

    【讨论】:

    • 在#对向量做一些事情,我想对图像进行归一化(作为向量)我需要做线性归一化还是直方图均衡?还有一个问题,我可以使用你的代码作为函数,如果我有一组图像,我如何将它们全部放在一个大矩阵中,并且每个图像都是一个向量?
    • 请显示您用于规范化的代码。我不明白您为什么要将 5 个图像放在一个矩阵中,以及您打算如何规范化它们。
    • 因为我想做人脸空间,每个向量都是一个图像,我想用直方图均衡化因为我想学习人脸识别是如何工作的!
    • @jameshwartlopez:感谢您的错误报告。如今,导入 Image 的正确方法是from PIL import Image。如果您没有安装 PIL,请考虑 installing Pillow,这是 PIL 的 actively developed 分支。
    • 看来 NumPy.matrix() 将被弃用。这是 StackOverflow 文章的链接,该文章提供了替代方案 stackoverflow.com/questions/53254738/…
    【解决方案2】:

    我曾经使用以下代码将 2D 转换为 1D 图像数组:

    import numpy as np
    from scipy import misc
    from sklearn.decomposition import PCA
    import matplotlib.pyplot as plt
    
    face = misc.imread('face1.jpg');
    f=misc.face(gray=True)
    [width1,height1]=[f.shape[0],f.shape[1]]
    f2=f.reshape(width1*height1);
    

    但我还不知道如何稍后在代码中将其改回二维,另外请注意,并非所有导入的库都是必需的,希望对您有所帮助

    【讨论】:

      【解决方案3】:
      import matplotlib.pyplot as plt
      
      img = plt.imread('orig.png')
      rows,cols,colors = img.shape # gives dimensions for RGB array
      img_size = rows*cols*colors
      img_1D_vector = img.reshape(img_size)
      # you can recover the orginal image with:
      img2 = img_1D_vector.reshape(rows,cols,colors)
      

      请注意,img.shape 返回一个元组,上面对rows,cols,colors 的多重赋值让我们计算与一维向量相互转换所需的元素数量。

      您可以显示 img 和 img2 以查看它们是否相同:

      plt.imshow(img) # followed by 
      plt.show() # to show the first image, then 
      plt.imshow(img2) # followed by
      plt.show() # to show you the second image.
      

      请记住,在 python 终端中,您必须关闭 plt.show() 窗口才能返回终端以显示下一张图片。

      对我来说这是有道理的,并且只依赖于 matplotlib.pyplot。它也适用于 jpg 和 tif 图像等。我尝试使用的 png 具有 float32 dtype,而我尝试使用的 jpg 和 tif 具有 uint8 dtype(dtype = 数据类型);每个似乎都有效。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 2018-11-20
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        • 2023-04-05
        • 1970-01-01
        相关资源
        最近更新 更多