为什么我不能使用 Jupyter 预览我的 TIFF 图像?为什么我无法用这些 TIFF 图像制作视频?

Why can't I preview my TIFF images with Jupyter ? And why am I failing to make a video out of those TIFF images?

我有一个包含很多 .tif 图像的文件。

第 1 部分。TIFF 图像预览

当我尝试通过在 jupyter 文件夹(看起来像这个 the Jupyter folder)中单击它们来预览它们时,我收到以下消息:

Error ! D:...\image.tif is not UTF-8 encoded

相反,如果我单击 Jupyter 文件夹中的 png,Jupyter 会显示图像。

知道我的文件夹中有 1000 多张图像,我该如何修复图像?

尽管如此,如果我写:

sph = cv2.imread('A1.tif',-1)
plt.imshow(sph)
plt.show()

我确实得到了图像:image of 'A1.tif'。

现在我也查了:

import chardet
chardet.detect('A1.det')
--> {'confidence': 1.0, 'encoding': 'ascii', 'language': ''}  # result

显然我是用 ascii 编码的。它与 utf-8 相同还是我应该转换它们?

编辑:回答: 在其中一条评论中,@FabienP 回答了 "According the official documentation, Jupyter lab does not support TIFF format for image preview (as of now)",这回答了这个问题。

第 2 部分:使用 TIFF 图像编写视频

我还有一个问题,我不知道这两个问题是否有关联。

我想用它们制作视频。

import cv2
import os
image_folder = 'A549_A1'
video_name = 'video.avi'

images = [img for img in os.listdir(image_folder) if img.endswith(".tif")]
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape

video = cv2.VideoWriter(video_name, 0, 1, (width,height))

for image in images:
     video.write(cv2.imread(os.path.join(image_folder, image)))

cv2.destroyAllWindows()
video.release()

但是我没有得到预期的视频,而是得到了一个包含许多图像的奇怪视频:caption of the video。您可以将其与上图进行比较,以检查它是否不正常。

我该如何解决?

将图像中的字节从 ASCII 转换为 UTF-8 只比将它们从华氏度转换为摄氏度或将它们转换为 B♭ 大调更有意义。如果你能找到一种技术上的方法,它所做的就是破坏图像。确实,这完全是转移注意力,与您的视频转换问题完全无关。

ASCII 和 UTF-8 等文本编码描述了字符在代码点或字形与计算机表示之间的映射方式。图像文件中没有文本;它只是一堆像素。或许还可以查看 2003 年开创性的博客 post The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

此外,因为 UTF-8 是 ASCII 兼容的,所以每个 ASCII 文件已经是一个 UTF-8 文件。您无法应用任何转换来实现 "more UTF-8".

另一方面,二进制格式通常具有完全不同的内部结构。对于一个图像,一个简单的格式可能只是将每个黑色像素编码为 1 位,将每个白色像素编码为 0 位。 (事实上​​ , TIFF 的第一个版本正是这样做的,还有一些额外的装饰。)例如,您可以为每个字节添加一个常量,但这只会将其转换为不再包含的混乱一张有效的照片。检查如果你将 1 加到一个数字上会发生什么,比如 63,它的二进制表示的下半部分有很多 1 位:

 63    0011 1111      ..XX XXXX  <- sequence of black pixels
+ 1  + 0000 0001      .... ...X
---- -----------     ----------
 64    0100 0000      .X.. ....  <- one black pixel, lots of white

现代二进制格式要复杂得多,并且通常包含 header 序列,这些序列指示后面有多少字节的数据或在何处查找特定功能以填充内存中的数据结构。用其他值替换这些值几乎肯定会创建一个简单损坏的流,除非您确切地知道自己在做什么。


https://whosebug.com/a/34555939/874188 进行比较并在谷歌上搜索了一下表明将 0 作为 fourcc 参数传递可能是问题的根源。