簡體   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