Cap*_*o95 4 python image python-3.x
我有一系列图像,都可以在 JP2 和 PNG 上使用,我需要在 python 程序上加载此图像以按顺序显示它们。现在我只需要显示序列的一部分,例如:
您可以将可爱的小型 JPEG/PNG/JP2 图像作为一堆字节读入内存,并以与磁盘上相同的大小压缩它们,然后在需要时从内存中解压缩它们。
首先,让我们看看内存中 RGB888 的 1280x1024 图像所需的内存 - 高达 3.9MB:
# Decompressed image in memory takes 3.9MB memory
im = np.zeros([1280,1024,3], dtype=np.uint8)
# print(im.nbytes) => 3932160
Run Code Online (Sandbox Code Playgroud)
现在让我们看一下相同大小的 JPEG:
它在磁盘上,带有ls -l:
-rw-r--r--@ 1 mark staff 47276 2 Apr 17:13 image.jpg
Run Code Online (Sandbox Code Playgroud)
这里它仍然在内存中被压缩,同样为 47kB,即大小的 1.2%:
# Same image as JPEG takes 47kB of memory
with open('image.jpg','rb') as f:
jpg = f.read()
# print(len(jpg)) => 47276
Run Code Online (Sandbox Code Playgroud)
现在,当您需要图像时,从内存而不是从磁盘解压缩它
# Read with 'imageio'
from io import BytesIO
import imageio
numpyArray = imageio.imread(BytesIO(jpg))
# print(numpyArray.shape) =>(1024, 1280, 3)
# Or, alternatively, and probably faster, read with OpenCV
import cv2
numpyArray = cv2.imdecode(np.frombuffer(jpg,dtype=np.uint8), -1)
# print(numpyArray.shape) =>(1024, 1280, 3)
Run Code Online (Sandbox Code Playgroud)
另一个完全不同的选项是对图像进行调色,它可以更快地解码数英里,但只会将内存占用减少 3 倍。您将颜色数量减少到 256 种独特颜色以下,并存储包含 256 种颜色的调色板。然后,在每个像素位置存储一个字节(即调色板索引),而不是 3 个字节的 RGB。这会将内存使用量从 3.9MB/图像减少到 1.3MB/图像。它不需要任何解码。但可能会导致颜色保真度和/或条带的轻微损失 - 这可能是也可能不是问题,具体取决于相机/图像的质量。
看起来像这样:
from PIL import Image
import numpy as np
im = Image.open('image.jpg')
# Make into Numpy array - size is 3.9MB
a = np.array(im)
# Now make a 256 colour palletised version
p = im.convert('P',palette=Image.ADAPTIVE)
# Make into Numpy array - size is now only 1.3MB
a = np.array(p)
Run Code Online (Sandbox Code Playgroud)