无法在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([[255,0]])
表示2像素plt.imshow([[255,0128]])
将所有颜色显示为模糊
边界。这里发生了什么事好的,那么你的一些问题是关于
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)