查看cv2 檔案,我得到的印象是應該能夠在 Python 中np.float64通過 anp.clip后跟型別強制來匹配資料的寫入np.uint8。然而,情況似乎并非如此。可重現的例子:
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在不保存中間檔案的情況下計算與上面示例中相同的陣列?
uj5u.com熱心網友回復:
arr2和之間的區別在于arr3,arr3每個值的小數部分都被截斷了。arr2a和之間的差異arr3a有時為 0,有時為 1。看起來imwrite()可能會在轉換為整數之前對值進行四舍五入,而不是像astype()這樣洗掉小數部分。
讓我們做一些實驗,看看這是否屬實。
cv2.imwrite('out2b.png', arr2-0.5)
生成一個與out3.png. 同樣地,
arr3 = np.round(arr2).astype(np.uint8)
cv2.imwrite('out3b.png', arr3)
生成一個與out2.png. 因此,似乎確實imwrite()會舍入輸入浮點值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510786.html
下一篇:修復傾斜/傾斜的文本Opencv
