当前位置: 首页 > 知识库问答 >
问题:

使用Python读取16位灰度PNG的大问题

庄萧迟
2023-03-14

我有一个大问题,试图将一个大的科学图像(7MB)16位PNG图像转换为JPG,以便压缩它并检查Python中的任何最终工件。原始图像可在以下位置找到:https://postimg.cc/p5PQG8ry在这里阅读其他答案时,我尝试了枕头和OpenCV,但没有成功。我得到的唯一东西是一张白色的床单。我做错了什么?注释行是使用Python读取16位PNG图像文件的尝试,但似乎不适用于生成数据类型错误的我。

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

共有1个答案

魏波娃
2023-03-14

多亏了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表示无损压缩。

 类似资料:
  • 我是opencv4android的新手,试图加载16位深度的灰度png图像。 我试过: 但是png被读取为8bit,值在[0,255]中。我尝试了CV_LOAD_IMAGE_ANYDEPTH标志,但还是一样。我试图创建一个alpha通道或将图像作为原始图像加载,但没有成功。 我还尝试在设备上复制图像,并使用imread读取,如下所示,希望imread能够加载16位通道: 当我检查它确实存在。返回的

  • 我想在Javascript中加载一个16位灰度PNG(其中每个像素代表一个数字/深度值。TUM使用这种文件格式来存储深度信息) 然而,opencv读取的图像。js是RGBA 8位(——我想得到CV。CV_16UC1),这似乎是因为图像是由浏览器本身解码的,如文件所示。因此,我们得到的不是一个像素,而是一个介于0和65535(2^8-1)之间的值,而是一个介于0和255(2^8-1)之间的数字,R=

  • 我有一个我想尝试的灰度图像(实际上是“lena”)。我得到了一个512x512的PNG文件,有216种灰色阴影。 事情是这样的,当我用JavaImageIO阅读它时,就像这样: 我得到一个只有154种颜色的BuffereImage!我只是意识到了这一点,因为我处理过的图像看起来发黄,缺乏深黑色。 更令人恼火的是,当我使用XnView将PNG转换为GIF时,这是一个无损的过程,在这种情况下,用上面的

  • 我是第一次使用openCV。我正在使用openCV3和XCode对其进行编码。我想创建一个16位的灰度图像,但我想我有的数据是这样定义的,4000是像素值为白色和0为黑色。我在int类型的数组中有这些像素的信息。如何创建Mat并将数组中的值分配给Mat?

  • 我对Android的NFC很陌生。我需要大量Java代码示例或好的教程,以了解如何使用Nexus 5读取Mifare Ultralight 16位UID 我只知道如何从这里读取Mifare classic卡的标签UID,获得MifareClassic的7位数UID,但没有Mifare Ultralight的示例。 这是获取Mifare Classic UID的另一个示例。Mifare Ultral

  • 以下程序演示如何将彩色图像读取为灰度并使用JavaFX窗口显示。 在这里通过将标志与带有彩色图像路径的字符串一起传递来读取图像。 假定以下是上述程序中指定的输入图像。那么输出结果应该为一个灰色的图片。