如何在 OpenCV 中读取 .tif 图像

新手上路,请多包涵

我想在 OpenCV Python 中加载和显示 .tif 图像。我使用 cv2.imread(‘1_00001.tif’) 加载图像,然后使用 plt.imshow(img) 显示它,但显示的图像全黑,而不是原来的图像。

我可以使用 PIL 的 Image.open() 和 matplotlib 的 mpimg.imread() 正确加载和显示图像,所以我认为这是一个特定于 cv2 的问题。但是,我也使用相同的 cv2.imread() 函数成功显示了 .jpg 和 .tiff 图像,因此它也可能是特定于 .tif 图像的问题。

 import cv2
import matplotlib.pyplot as plt

img = cv2.imread('1_00001.tif')
plt.imshow(img)

我期待一个圆圈的图像,里面有一些模糊的线条,但实际输出只是一个黑色图像。

原文由 Kathy Wu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.9k
2 个回答

检查您的图像像素值。 plt.imshow 0-255 的像素值,所以我猜你输入的 PNG 图像的值大于 255,它们都被剪切到 255(黑色)。 通常您需要在将 TIFF 或 PNG 图像 提供给 plt.imshow 之前对其进行标准化,所以有趣的是您在某些 tiff 图像上没有看到这个问题。

原文由 skeller88 发布,翻译遵循 CC BY-SA 4.0 许可协议

cv2 是一个旨在处理 8 位 rgb 图像的计算机视觉库。我怀疑你的 .tif 是单色的,可能 uint16 (显微镜常见)因此,如果你希望读取具有完整保真度的图像,则需要 cv2.IMREAD_UNCHANGED

 import cv2
import numpy as np
img = cv2.imread('1_00001.tif', cv2.IMREAD_UNCHANGED)
print(f'dtype: {img.dtype}, shape: {img.shape}, min: {np.min(img)}, max: {np.max(img)}')

dtype: uint16, shape: (128, 128), min: 275, max: 5425

如果没有 cv2.IMREAD_UNCHANGED 标志 cv2 则会将图像转换为 8 位 rgb:

dtype: uint8, shape: (128, 128, 3), min: 1, max: 21

matplotlib.imshow 具有不同的行为,具体取决于输入。大小为 [M,N] 的数组将使用按比例缩放到数据的颜色图进行渲染。大小为 [M,N,3] 的数组将呈现为 RGB,对于 int 范围为 0-255,对于浮点数范围为 0-1(无自动缩放!)很可能您的图像包含低整数值,因此在绘制时显示为黑色没有自动缩放的 maplotlib。如果您使用 cv2.IMREAD_UNCHANGED 标志或一次绘制一个通道,这应该不是问题。

您可能还希望查看专门为处理 tiff 文件而设计的其他库,即 tifffile 。但是,我会注意到 cv2 在我的经验中比 tifffile 快得多。

原文由 trygvrad 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题