繁体   English   中英

如何读取OpenCV中的.tif图像

[英]How to read .tif image in OpenCV

我想加载并显示 OpenCV Python 中的 a.tif 图像。我使用 cv2.imread('1_00001.tif') 加载图像,然后使用 plt.imshow(img) 显示它,但显示的图像全黑它原来是什么。

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

import cv2
import matplotlib.pyplot as plt

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

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

检查您的图像像素值。 plt.imshow像素值从 0-255 剪辑,因此我猜您正在输入值大于 255 的 PNG 图像,并且它们都被剪辑为 255(黑色)。 通常,在将 TIFF 或 PNG 图像提供给plt.imshow之前,您需要对其进行plt.imshow ,因此有趣的是,您在某些 tiff 图像上没有看到此问题。

我认为,某些 tiff 标签在 openCV 中无法正常工作,请尝试

img=cv2.imread("YOURPATH/opencv/samples/data/lena.jpg",cv2.IMREAD_COLOR)
cv2.imwrite("1_00001.tif",img)
img1=cv2.imread("1_00001.tif")

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(无自动缩放)很可能您的图像包含低 integer 值。 因此在没有自动缩放的情况下在 maplotlib 中绘制时显示为黑色。 如果您一次使用cv2.IMREAD_UNCHANGED标志或 plot 一个通道,这应该不是问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM