【问题标题】:Why can't I preview my TIFF images with Jupyter ? And why am I failing to make a video out of those TIFF images?为什么我不能使用 Jupyter 预览我的 TIFF 图像?为什么我不能用这些 TIFF 图像制作视频?
【发布时间】:2019-02-26 16:23:53
【问题描述】:

我有一个包含大量 .tif 图像的文件。

第 1 部分。TIFF 图像预览

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

错误! D:...\image.tif 不是 UTF-8 编码的

相反,如果我单击 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 相同还是我应该转换它们?

编辑:回答: 在其中一个 cmets 中,@FabienP 回答“根据官方文档,Jupyter 实验室不支持 TIFF 格式的图像预览(截至目前)”,回答了这个问题问题。

第 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。您可以将其与上图进行比较以检查它是否不正常。

我该如何解决这个问题?

【问题讨论】:

  • 非常困惑。 UTF-8 是一种文本编码;对于根本不是文本的数据,要求它绝对没有意义。
  • 如果您按照最小、完整、可验证示例的要求显示您的代码,您将更有可能得到答案stackoverflow.com/help/mcve
  • @tripleee 你的意思是我的问题很混乱还是错误信息很混乱?
  • 根据官方文档,Jupyter lab does not support TIFF 格式的图片预览(截至目前)。
  • 如果按照建议,不支持 TIFF,您可以使用 ImageMagick命令提示符中使用此命令制作所有 TIFF 文件的 PNG 版本> magick mogrify -format PNG *.tif 不过,如果你真的想用 OpenCV 阅读它们,这不是必需的,因为它无论如何都能理解 TIFF。

标签: python image tiff utf


【解决方案1】:

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

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

此外,因为 UTF-8 与 ASCII 兼容,所以每个 ASCII 文件都已经是普通的 UTF-8 文件。您无法应用任何转换来使其“更加 UTF-8”。

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

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


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

【讨论】:

  • stackoverflow.com/a/31401095/874188 建议使用cv2.VideoWriter_fourcc(list("MJPG")),尽管关于同一问题的另一个答案声称它曾经一度表现不佳,并且您可以尝试许多其他选择。
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 2017-12-01
  • 2016-02-01
  • 1970-01-01
  • 2020-11-15
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多