因此,我使用这个非常简单的图像来理解图像是如何存储在数组中的,以及如何操作它。
SIDE NOTE
Can anyone suggest me a book/blog which starts with these basics, as most of them skipping this part and even though trivial but I cant progress with these small nuances eating my head
它的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)
现在进行分析,首先我从显示一些数组开始,然后最后显示“点.png““
链接到点.png图像(使用ctrl+s将其保存为非常小的2x2像素,因此不可见)https://i.stack.imgur.com/y2ot9.png
^{pr2}$但是
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([0])
失败而{plt.imshow([[0]])
&;plt.imshow([[255]])
都只显示蓝色?即使0不代表蓝色,也不代表蓝色
255表示蓝色。在plt.imshow([[0]])
显示的是1x1大小的图像。是单像素图像吗?如果是的话
plt.imshow([[255,0]])
表示2个像素?在plt.imshow([[255,0,128]])
显示所有颜色为模糊
边界。这里发生了什么事?在
好的,你的一些问题是关于^{} 的行为。在
imshow
显示一个图像,并将“类似数组”的内容作为参数,形状为(n, m)
(对于灰度图像)、(n, m, 3)
(对于彩色图像)或{当您执行
plt.imshow([0])
操作时,您将传递一个形状为(1,)
的参数,这就是为什么会出现错误。列表[0]
是一维的,而不是二维的,因此imshow
无法显示。相比之下,[[0]]
是二维数组,表示单个像素,因此可以显示。在[[0]]
和{cmap
指定不同的值,matplotlib默认使用^{plt.imshow([[255,0]])
正在显示一个两像素的图像;您传递的数组有一行两列。Matplotlib将其显示为两种颜色:我们可以看到红色代表高(255
),蓝色代表低(0
)。在由于matplotlib对图像数据进行插值,因此图像变得模糊。您可以通过将
interpolation
参数的值赋给imshow
(matplotlib默认为使用'bilinear'
,这样可以获得“抗锯齿”外观)。在接下来,您将显示一个3像素的灰度图像(
[[255,0,128]]
)。{从蓝色到蓝色的渐变色是从蓝色到蓝色的渐变色。[[255,128,128]]
将是红色、蓝色、蓝色,因为此数据的范围是128到255,所以128将是新的低值(蓝色)。在好的,最后,我们来看看您的8x8图像。您的PNG图像可能只包含黑白像素,但它是以RGB格式存储的。我们可以看到,例如,使用ImageMagick:
^{pr2}$所以这意味着每个像素由三个字节表示(红色、绿色和蓝色)。PIL在RGBA模式下打开,为alpha通道添加另一个字节:
第一个像素是黑色的,其他的是白色的。我们可以看到黑色是元组
(0, 0, 0, 255)
(也就是说,0红色,0绿色,0蓝色,255,或完整的alpha)。同样,白色是(255, 255, 255, 255)
:当您将此图像放入numpy数组中时,您将获得这些相同的像素值。数组的形状为
(8, 8, 4)
:这意味着每个像素有8行、8列和4个分量(红、绿、蓝、阿尔法)。在
取
a[0]
得到这个数组的第一行,它的形状是(8, 4)
。有8列像素,每列有4个分量。当您将这个发送到imshow
时,它将被解释为8x4大小的灰度图像,因为您有二维数据。您将得到图像第一行的彩色映射显示。您可以将第一个像素看作三个蓝色值(黑色像素的三个0
)。图像的最后一列到处都是红色的,因为您的图像到处都是完整的alpha。在a[0:1]
为您提供数组的一部分;这将是(1, 8, 4)
的形状。当你把这个发送到imshow
时,它会被解释为1x8大小的彩色图像(因为它是三维数据,最后一个维度是4,用字母信息表示颜色)。这就是为什么显示这个会给你一个黑白条,这是你可能会看到的图片。您可以通过显示[a[0]]
得到相同的结果。在因为y当你处理黑白图像数据时,用灰度表示数据可能更直观。您可以将PNG文件更改为灰度,也可以使用PIL在Python中转换图像:
如果使用灰度数据,
imshow
将始终对所有内容进行颜色映射,因此不会在颜色映射的灰度信息和全色信息之间进行不可预知的切换(这取决于发送到imshow
的数组数据的形状)。在小结:
imshow
显示数组中的值。数组的形状很重要,因为imshow
将在显示彩色映射灰度数据或显示全色数据之间自动切换。在imshow
对值进行插值,导致图像模糊。在imshow
通常用于显示具有单个分量(灰度)的二维数据;颜色映射有助于使绘图更具吸引力,并显示如果所有内容都是灰色则更难看到的变化。另一方面,图像数据通常包含颜色信息。在我不确定你在哪里可以得到一个图像处理初学者的概述(也许可以试着通读How do I get started with image processing?)。我以前听过Lecture 1 Introduction to Digital Image Processing推荐,您也可以继续探索,就像您一直在做的那样,例如,通过阅读简单的Netpbm format之类的图像数据格式。在
相关问题 更多 >
编程相关推荐