【问题标题】:Big issue reading a large 16bit grayscale PNG using Python使用 Python 读取大型 16 位灰度 PNG 的大问题
【发布时间】:2021-05-12 19:58:21
【问题描述】:

我在尝试将大型科学图像 (7 Mb) 16 位 PNG 图像转换为 JPG 以压缩它并检查 Python 中的任何最终工件时遇到了一个大问题。 原始图像可以在以下位置找到: https://postimg.cc/p5PQG8ry 在这里阅读其他答案,我尝试过 Pillow 和 OpenCV,但没有成功,我唯一得到的是一张白纸。我做错了什么? 注释行是来自Read 16-bit PNG image file using Python 的尝试,但似乎不适用于我生成数据类型错误。

import numpy as np
from PIL import Image 
import cv2
image = cv2.imread('terzafoto.png', -cv2.IMREAD_ANYDEPTH)
cv2.imwrite('terza.jpg', image)
im = Image.open('terzafoto.png').convert('RGB')
im.save('terzafoto.jpg', format='JPEG', quality=100)
#im = Image.fromarray(np.array(Image.open('terzafoto.jpg')).astype("uint16")).convert('RGB')

【问题讨论】:

  • 为什么cv2.IMREAD_ANYDEPTH前面有个减号?
  • 我试过用减号和没有.....没有结果。取自stackoverflow.com/questions/48863230/…
  • 那篇文章完全是错误的,我在其中添加了一些 cmets 来解释原因。文档中没有这样的东西,源代码证实了这一点。
  • 无论如何,OpenCV 只能写 8 位 JPEG 文件(而标准 JPEG 格式的 IIRC 也只能写 8 位,但我可能错了)。 OpenCV 中的 JP2 (JPEG 2000) 编解码器支持 16 位。
  • 谢谢!这已经是黑暗中的一些光明!有用 !我使用 [cv2.IMWRITE_JPEG_QUALITY, 90] 快速生成了一组具有不同压缩因子的图像。块伪影在质量较低时很明显。我认为默认值约为 [cv2.IMWRITE_JPEG_QUALITY, 95] !

标签: opencv python-imaging-library


【解决方案1】:

感谢 Dan Masek,我能够在我的代码中找到错误。 我没有正确地将数据从 16 位转换为 8 位。 这里是 OpenCV 和 Pillow 解决方案的更新代码。

import numpy as np
from PIL import Image
import cv2
im = Image.fromarray((np.array(Image.open('terzafoto.png'))//256).astype("uint8")).convert('RGB')
im.save('PIL100.jpg', format='JPEG', quality=100)
img = cv2.imread('terzafoto.png', cv2.IMREAD_ANYDEPTH)
cv2.imwrite('100.jpeg', np.uint8(img // 256),[int(cv2.IMWRITE_JPEG_QUALITY), 100])

可以根据您的需要设置图像质量系数。 100 表示无损压缩。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2011-12-25
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多