簡體   English   中英

cv2.imwrite 與 np.float64 數據的行為

[英]Behaviour of cv2.imwrite with np.float64 data

查看cv2 文檔,我得到的印象是,應該能夠在 Python 中通過np.clip然后將類型強制轉換為np.uint8來匹配np.float64數據的寫入。 然而,情況似乎並非如此。 可重現的例子:

import cv2
import numpy as np

arr = np.random.uniform(low=0, high=300, size=(64,48,3))
arr2 = np.clip(arr, 0, 255)
arr3 = arr2.astype(np.uint8)

cv2.imwrite('out1.png', arr)
cv2.imwrite('out2.png', arr2)
cv2.imwrite('out3.png', arr3)

arr1a = cv2.imread('out1.png')
arr2a = cv2.imread('out2.png')
arr3a = cv2.imread('out3.png')
print((arr1a==arr2a).all())
print((arr1a==arr3a).all())

第一次檢查產生True ,第二次檢查產生False

這表明 (1) cv2.imwrite在寫出之前確實在數組上調用np.clip(arr, 0, 255) (2) 然后它不會調用.astype(np.uint8) (或者至少,這還不是全部)。

我的目標是了解cv2.imwrite到底對arr做了什么。 換句話說,如何在不保存中間文件的情況下計算與上面示例中的arr1a相同的數組?

arr2arr3之間的區別在於arr3已將每個值的小數部分截斷。 arr2aarr3a之間的差異有時為 0,有時為 1。看起來imwrite()可能會在轉換為整數之前對值進行四舍五入,而不是像astype()那樣僅刪除小數部分。

讓我們做一些實驗,看看這是否屬實。

cv2.imwrite('out2b.png', arr2-0.5)

生成一個與out3.png相同的 PNG 文件。 同樣地,

arr3 = np.round(arr2).astype(np.uint8)
cv2.imwrite('out3b.png', arr3)

生成一個與out2.png相同的 PNG 文件。 因此,似乎imwrite()確實會舍入輸入浮點值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM