【发布时间】:2021-04-12 08:27:11
【问题描述】:
我正在尝试使用 jupyter-notebooks 中的 ipywidgets 显示 .tif 图像。以下代码适用于 .png 和 .jpg 文件
from ipywidgets import Image
png_image_path = r"C:\Users\xxxxxxxx\Work\Exercises\images\000000000.png"
file = open(png_image_path, "rb")
im = file.read()
Image(
value=im,
width=300,
height=400,
)
type(im) # <class 'bytes'>
上述代码中的 ipywidget 呈现所需的图像。为了读取tif 文件,我使用的是gdal。
img = gdal.Open(tif_img_path).ReadAsArray()
print(img.shape) # (3, 1024, 1024)
print(img.transpose(1,2, 0).shape) # (1024, 1024, 3)
type(img.transpose(1,2,0).tobytes()) # <class 'bytes'>
Image(
value=img.transpose(1,2,0).tobytes(),
width=300,
height=400,
)
我得到以下输出,图像在 ipywidget 中没有正确显示
【问题讨论】:
-
我不使用 jupyter 或它的小部件,但是......在第一个示例中,您将传递带有 PNG 标头、日期、位/像素、颜色类型和压缩像素数据的 PNG 编码图像.在 GDAL 的情况下,您传递的是没有标题的未压缩像素......非常不同的东西。
-
我也尝试了第一种方法来处理 tif 文件,但没有奏效。然后我看到Image小部件中传递的im类型是字节,所以我认为将图像读取为字节可以用于tif图像。
-
尝试打印
im[:40],您会看到/x89PNG和IHDR,这就是PNG 标头在磁盘上的样子。对您的 TIFF 执行相同操作,您将看不到 TIFF 标头(以II或MM开头)。 -
可能还有其他方法,但您可以使用 ImageMagick 将 TIFF 转换为带有
magick input.tif output.png的 PNG。或者您可以在 Python 中使用 OpenCVimencode()将 GDAL 读取的 Numpy 数组放入 "in-memory" PNG。 -
imencode()示例...stackoverflow.com/a/66036559/2836621
标签: jupyter-notebook tiff ipywidgets