代码之家  ›  专栏  ›  技术社区  ›  u354356007

相同数量的阵列通过枕头产生不同的图像

  •  0
  • u354356007  · 技术社区  · 11 年前

    我在一个简单的脚本中使用numpy和Pillow来应用图像过滤器。在实现图像和内核的卷积之后,出现了一些bug,我能够将其简化为一个相当棘手的情况。

    import numpy as np
    from PIL import Image
    
    
    def image_to_array(image_path : str) -> np.array:
        image = Image.open(image_path)
        array = np.array(image)
        array.reshape(-1, array.shape[2])
        return array
    
    
    def dont_filter_anything(matrix : np.ndarray, kernel : np.ndarray):
        matrix_out = np.zeros(matrix.shape)
        for (row_num, cell_num, channel_num), element in np.ndenumerate(matrix):
            matrix_out[row_num][cell_num][channel_num] = element
        return matrix_out
    
    
    IDENTITY_FILTER = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]])
    

    第二个函数只是复制而不是产生卷积结果。根据这些定义,我执行以下操作:

    image1 = image_to_array('1.bmp')
    image2 = dont_filter_anything(image1 , IDENTITY_FILTER)
    assert np.all(image1 == image2)
    Image.fromarray(image2 , mode='RGB').save('2.bmp')
    Image.fromarray(image1 , mode='RGB').save('3.bmp')
    

    断言说两个数组相等,但下面是图片:

    1.bmp和3.bmp: http://i.stack.imgur.com/EwwyY.png

    2.bmp格式: http://i.stack.imgur.com/kz7pB.png

    这里会出什么问题?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Imanol Luengo    11 年前

    错误的原因可能是数据类型和索引。

    • 首先,数据类型:

      matrix_out = np.zeros(matrix.shape)
      

      创建一个浮点数组,您应该将其替换为:

      matrix_out = np.zeros_like(matrix)
      

      matrix_out = np.zeros(matrix.shape, dtype=matrix.dtype)
      

      确保 in 矩阵和 out 矩阵具有相同的数据类型。默认情况下 np.zeros 创建浮点数组。

    • 第二,索引:

      matrix_out[row_num][cell_num][channel_num] = element
      

      应更换为合适的(更快) numpy indexing 方法:

       matrix_out[row_num, cell_num, channel_num] = element
      

    这样,函数将被重写为:

    def dont_filter_anything(matrix, kernel):
        matrix_out = np.zeros_like(matrix)
        for (row_num, cell_num, channel_num), element in np.ndenumerate(matrix):
            matrix_out[row_num, cell_num, channel_num] = element
        return matrix_out
    

    现在PIL保存图像 2.bmp 正确地

    推荐文章