Python阅读大型png文件降级,降低质量

时间:2016-03-18 02:16:38

标签: python image opencv numpy png

我在python中尝试了很多方法来读取,打开和保存PNG文件以复制原始数组数据以进行进一步的图像处理,其中一些方法的大小为40 MB。但在读取图像期间,图像本身会降级,在此过程中质量和尺寸会降低。所以我不能再使用该数据阵列进行进一步操作[例如过滤]和进一步收集数据[例如psnr,entropy]因为已阅读的内容不再是原始图像。

  

使用Pil。

from PIL import Image 

i = Image.open('shoes.png') 
i.show()

Original Image| note I saved it in jpeg but the quality looks like it. 40 mb in png format

Opened image from "i.show", 18.1 mb in png format

  

与python CV相同

import cv2
img = cv2.imread('shoes.png' ) 

它产生蓝色的图像。

所以我没理解。这些库是否对图像的大小有限制?因为我尝试使用PNG格式来保证图像质量没有损失,但在读取图像时,会降低图像质量。

您能否回答有关此问题的问题,或者您能否提出一种更好的方法来获取numpy数组,大型原始图像或PNG图像的数据,而不会在读取文件和保存文件时降低图像质量。

注意:此外,当我尝试在较小的图像文件上使用PIL代码时,它根本不会降低图像质量。

1 个答案:

答案 0 :(得分:0)

我认为问题不在于处理大型PNG文件。这是一个脚本,它生成一个与图像大小相同的数组,将其保存到PNG文件,然后使用PIL/Pillow将其读回。输出显示在脚本之后。结果是从文件读取的数据与原始数组相同。

要将numpy数组写入文件,我使用的是一个名为numpngw的库。您也可以使用PIL / Pillow或PyPNG代替 . . . var client = new MyWebViewClient(); WebView web = FindViewById<WebView>(Resource.Id.webView1); web.SetWebViewClient(client); . . . class MyWebViewClient : WebViewClient { public override void OnReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, string host, string realm) { handler.Proceed(username, password); } }

numpngw

输出:

from __future__ import print_function

import numpy as np
from numpngw import write_png
from PIL import Image


# For reproducibility...
np.random.seed(123)

# Generate random data to use for the image.
data = np.random.randint(0, 255, size=(3072, 4608, 3)).astype(np.uint8)
# Put a small white block in the corner
data[:3, :3, :] = 255

# Take a look at the red channel of a small subset of the image.
print(data[:4, :12, 0])

# Write the array to a PNG file.  I use numpngw.write_png; PIL and PyPNG
# are alternatives that could be used.
write_png("foo.png", data)

# Open the file using PIL (actually Pillow) and create a numpy
# array containing the image.
img = Image.open("foo.png")
a = np.array(img)

# Take a look at the red channel of a small subset of array.  It should
# be the same as the previous output.
print()
print(a[:4, :12, 0])

compare_str = "equal" if np.all(data == a) else "not equal"
print("\nRound-trip result: the arrays are %s." % compare_str)