[英]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
相同的數組?
arr2
和arr3
之間的區別在於arr3
已將每個值的小數部分截斷。 arr2a
和arr3a
之間的差異有時為 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.