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