在python中无法将图像作为数组

2024-03-28 18:02:37 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我使用这个非常简单的图像来理解图像是如何存储在数组中的,以及如何操作它。8x8 pixel image

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.pngdot.png image 2x2 pixel

^{pr2}$

但是

plt.imshow([[0]])

first_image

plt.imshow([[255]])

second_image

 plt.imshow([[255,0]])

third_image

plt.imshow([[255,0,128]])

fourth_image

plt.imshow([[255,0],[23,128]])

fifth_image

plt.imshow(iar[0])

sixth_image

plt.imshow(iar[0:1])

seventh_image

# 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)

我的问题:

  1. 为什么plt.imshow([0])失败而{}起作用?在
  2. 为什么plt.imshow([[0]])&;plt.imshow([[255]])都只显示蓝色?即使0不代表蓝色,也不代表蓝色 255表示蓝色。在
  3. 这些图像中的像素在哪里。plt.imshow([[0]])显示的是1x1大小的图像。是单像素图像吗?如果是的话 plt.imshow([[255,0]])表示2个像素?在
  4. 为什么颜色模糊而且不清晰,我没有给出任何关于α/模糊的信息。但还是 plt.imshow([[255,0,128]])显示所有颜色为模糊 边界。这里发生了什么事?在
  5. 为什么iar[0]会以彩色图像的形式出现呢点.png只是黑白图像。但iar[0:1]显示了点.png和它在那里的储存完全一样。在

Tags: of图像importpngaswithplt像素
1条回答
网友
1楼 · 发布于 2024-03-28 18:02:37

好的,你的一些问题是关于^{}的行为。在

imshow显示一个图像,并将“类似数组”的内容作为参数,形状为(n, m)(对于灰度图像)、(n, m, 3)(对于彩色图像)或{}(对于透明或alpha信息的彩色图像)。在

当您执行plt.imshow([0])操作时,您将传递一个形状为(1,)的参数,这就是为什么会出现错误。列表[0]是一维的,而不是二维的,因此imshow无法显示。相比之下,[[0]]是二维数组,表示单个像素,因此可以显示。在

[[0]]和{}都将显示为蓝色方块。这是因为matplotlib colour映射灰度图像的像素值。颜色映射意味着matplotlib会在传递给它的数据中找到值的范围,并将最小值设置为一种颜色,将最高值设置为另一种颜色,并且在这两种颜色之间的所有值都映射到某种颜色范围中,这些颜色的设计要么看起来漂亮,要么对解释数据很有用。如果您的图像只有一个像素,则没有颜色范围,因此整个图像将以相同的颜色显示。注意,如果不为参数cmap指定不同的值,matplotlib默认使用^{}颜色映射。在

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

由于matplotlib对图像数据进行插值,因此图像变得模糊。您可以通过将interpolation参数的值赋给imshow(matplotlib默认为使用'bilinear',这样可以获得“抗锯齿”外观)。在

plt.imshow([[255,0]], interpolation='none')

No interpolation

接下来,您将显示一个3像素的灰度图像([[255,0,128]])。{从蓝色到蓝色的渐变色是从蓝色到蓝色的渐变色。[[255,128,128]]将是红色、蓝色、蓝色,因为此数据的范围是128到255,所以128将是新的低值(蓝色)。在

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

^{pr2}$

所以这意味着每个像素由三个字节表示(红色、绿色和蓝色)。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)

>>> i.getpixel((0,0))
(0, 0, 0, 255)
>>> i.getpixel((1,0))
(255, 255, 255, 255)

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

>>> import numpy as np
>>> a = np.asarray(i)
>>> a.shape
(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中转换图像:

>>> i2 = i.convert('L')
>>> a2 = np.asarray(i2)
>>> a2.shape
(8, 8)

如果使用灰度数据,imshow将始终对所有内容进行颜色映射,因此不会在颜色映射的灰度信息和全色信息之间进行不可预知的切换(这取决于发送到imshow的数组数据的形状)。在

小结:

  1. imshow显示数组中的值。数组的形状很重要,因为imshow将在显示彩色映射灰度数据或显示全色数据之间自动切换。在
  2. 默认情况下,imshow对值进行插值,导致图像模糊。在
  3. 注意图像数据的存储方式,包括图像文件和Python数据结构。imshow通常用于显示具有单个分量(灰度)的二维数据;颜色映射有助于使绘图更具吸引力,并显示如果所有内容都是灰色则更难看到的变化。另一方面,图像数据通常包含颜色信息。在

我不确定你在哪里可以得到一个图像处理初学者的概述(也许可以试着通读How do I get started with image processing?)。我以前听过Lecture 1 Introduction to Digital Image Processing推荐,您也可以继续探索,就像您一直在做的那样,例如,通过阅读简单的Netpbm format之类的图像数据格式。在

相关问题 更多 >