[英]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.