无法在python中以数组形式跟踪图像

无法在python中以数组形式跟踪图像,python,image,image-processing,Python,Image,Image Processing,所以我用这个非常简单的图像来理解图像是如何存储在数组中的,以及如何操作它 旁注 有人能给我推荐一本以这些基础知识为开头的书/博客吗?因为大多数人都跳过了这一部分,虽然很琐碎,但我不能 这些细微差别侵蚀着我的大脑 其8x8像素图像,左上角第一个像素中有一个点 #import modules import matplotlib.pyplot as plt from PIL import Image %matplotlib inline import numpy as np #Load image

所以我用这个非常简单的图像来理解图像是如何存储在数组中的,以及如何操作它

旁注
有人能给我推荐一本以这些基础知识为开头的书/博客吗?因为大多数人都跳过了这一部分,虽然很琐碎,但我不能 这些细微差别侵蚀着我的大脑

其8x8像素图像,左上角第一个像素中有一个点

#import modules
import matplotlib.pyplot as plt
from PIL import Image
%matplotlib inline
import numpy as np

#Load image as array
i=Image.open("dot.png")
iar=np.asarray(i)
现在进行分析,首先我将显示一些数组,然后我将最终显示“dot.png”

链接到dot.png图像(使用ctrl+s将其保存为非常小的2x2像素,因此不可见)

但是

我的问题是:-

  • 为什么
    plt.imshow([0])
    失败了,但是
    plt.imshow([0]])
    工作了
  • 为什么
    plt.imshow([[0]])
    plt.imshow([[255]])
    都只显示蓝色?即使0不代表蓝色,也不代表蓝色 我的意思是蓝色
  • 这些图像中的像素在哪里<代码>plt.imshow([[0]])正在显示大小为1x1的图像。是单像素图像吗?如果是,那么
    plt.imshow([[255,0]])
    表示2像素
  • 为什么颜色模糊而且没有很好的定义,我没有给出任何关于alpha/模糊的信息。但仍然
    plt.imshow([[255,0128]])
    将所有颜色显示为模糊 边界。这里发生了什么事
  • 为什么iar[0]作为彩色图像出现,即使dot.png只是黑白图像。但是iar[0:1]显示的dot.png的第一行与其存储的完全相同
    好的,那么你的一些问题是关于

    imshow
    显示图像,并将形状为
    (n,m)
    (对于灰度图像)、
    (n,m,3)
    (对于彩色图像)或
    (n,m,4)
    (对于具有透明度或alpha信息的彩色图像)的“数组状”对象作为参数

    执行
    plt.imshow([0])
    时,传递的参数的形状为
    (1,)
    ,因此会出现错误。列表
    [0]
    是一维的,而不是二维的,因此不能通过
    imshow
    显示。相比之下,
    [[0]]
    是一个二维数组,表示单个像素,因此可以显示

    [[0]]
    [[255]]]
    都将显示为蓝色方框。这是因为matplotlib颜色映射灰度图像的像素值。颜色映射意味着matplotlib在您传递的数据中查找值的范围,并将最低值映射为一种颜色,最高值映射为另一种颜色,并且将两种颜色之间的所有值映射到某个颜色范围,该颜色范围设计为美观,或有助于解释数据。如果您的图像只有一个像素,则没有颜色范围,因此整个图像将以相同的颜色显示。请注意,如果未为参数
    cmap
    指定其他值,matplotlib默认使用颜色映射

    plt.imshow([[255,0]])
    正在显示一个两像素的图像;您传递的数组有一行两列。Matplotlib将其显示为两种颜色:红色表示高(
    255
    ),蓝色表示低(
    0

    由于matplotlib插值图像数据,因此图像模糊。您可以通过为
    imshow
    interpolation
    参数指定一个值来更改此行为(matplotlib默认使用
    “双线性”
    ,从而获得“抗锯齿”外观)

    接下来,您将显示3像素灰度图像(
    [[255,0128]]
    )。这表现为从红色到蓝色到绿色的渐变;这些颜色再次取自
    jet
    彩色地图(红色为高,绿色为中,蓝色为低)<代码>[[255128128]]将是红色、蓝色、蓝色,因为此数据的范围是从128到255,所以128将是新的低位(蓝色)

    好的,最后,我们来看一下您的8x8图像。PNG图像可能只包含黑白像素,但它是以RGB格式存储的。我们可以看到这一点,例如,使用:

    这意味着每个像素由三个字节(红色、绿色和蓝色)表示。PIL在RGBA模式下打开,为alpha通道添加另一个字节:

    >>> from PIL import Image
    >>> import os
    >>> i = Image.open(os.path.expanduser('~/Downloads/y2ot9.png'))
    >>> i.size
    (8, 8)
    >>> i.mode
    'RGBA'
    
    第一个像素为黑色,其他像素为白色。我们可以看到黑色是元组
    (0,0,0,255)
    (即0红色、0绿色、0蓝色和255,或完整的alpha)。同样,白色是
    (255、255、255、255)

    当您将此图像放入numpy数组时,您将得到这些相同的像素值。数组的形状为
    (8,8,4)

    这意味着每个像素有8行、8列和4个组件(红色、绿色、蓝色、alpha)

    a[0]
    将得到此数组的第一行,其形状为
    (8,4)
    。有8列像素,每列有4个组件。当您将其发送到
    imshow
    时,它会被解释为大小为8x4的灰度图像,因为您有二维数据。您将获得图像第一行的彩色映射显示。您可以将第一个像素视为三个蓝色值(黑色像素的三个
    0
    s)。图像的最后一列到处都是红色,因为您的图像到处都是完整的alpha

    a[0:1]
    为您提供阵列的一部分;这将是形状
    (1,8,4)
    。当您将其发送到
    imshow
    时,它将被解释为大小为1x8的彩色图像(因为它是三维数据,最后一个维度是4,用alpha信息表示颜色)。这就是为什么显示它会给您一个黑白条,这是您可能希望看到的图片。您可以通过显示
    [a[0]]
    获得相同的结果

    因为您处理的是黑白图像数据,所以报告可能更直观
    plt.imshow([[0]])
    
    plt.imshow([[255]])
    
     plt.imshow([[255,0]])
    
    plt.imshow([[255,0,128]])
    
    plt.imshow([[255,0],[23,128]])
    
    plt.imshow(iar[0])
    
    plt.imshow(iar[0:1])
    
    # Checking attributes of iar[0]
    subset1=iar[0]
    subset1.shape
    Out[144]: (8L, 4L)
    In [140]:iar[0]
    Out[140]: 
    array([[  0,   0,   0, 255],
       [255, 255, 255, 255],
       [255, 255, 255, 255],
       [255, 255, 255, 255],
       [255, 255, 255, 255],
       [255, 255, 255, 255],
       [255, 255, 255, 255],
       [255, 255, 255, 255]], dtype=uint8)
    
    # Checking attributes of iar[0:1]
    subset2=iar[0:1]
    subset2.shape
    Out[146]: (1L, 8L, 4L)
    In [142]:iar[0:1]
    Out[141]: 
    array([[[  0,   0,   0, 255],
        [255, 255, 255, 255],
        [255, 255, 255, 255],
        [255, 255, 255, 255],
        [255, 255, 255, 255],
        [255, 255, 255, 255],
        [255, 255, 255, 255],
        [255, 255, 255, 255]]], dtype=uint8)
    
    plt.imshow([[255,0]], interpolation='none')
    
    $ identify ~/Downloads/y2ot9.png
    /home/user/Downloads/y2ot9.png PNG 8x8 8x8+0+0 8-bit sRGB 138B 0.010u 0:00.059
    
    >>> from PIL import Image
    >>> import os
    >>> i = Image.open(os.path.expanduser('~/Downloads/y2ot9.png'))
    >>> i.size
    (8, 8)
    >>> i.mode
    'RGBA'
    
    >>> i.getpixel((0,0))
    (0, 0, 0, 255)
    >>> i.getpixel((1,0))
    (255, 255, 255, 255)
    
    >>> import numpy as np
    >>> a = np.asarray(i)
    >>> a.shape
    (8, 8, 4)
    
    >>> i2 = i.convert('L')
    >>> a2 = np.asarray(i2)
    >>> a2.shape
    (8, 8)