opencv中imwrite對float的處理


最近在搞畢設,遇到了一個問題。網絡輸出圖像, 但是用imwrite寫入的文件,和imshow的存在差異。

 

 

左面是imwrite, 右面是imshow的。沖突上按絕直觀的差異就是感覺一些白色的像素點出現了異常。由於網絡輸出的浮點數,imshow和imwrite是這樣處理的:

# imwrite的過程
out = np.asarray(output_image) # 將網絡輸出轉換為array
cv2.imwrite('test.png', out * 255.0) # 網絡輸出的值為0,1

# imshow的過程
out = np.asarray(output_image) # 將網絡輸出轉換為array
out = out * 255.0 cv2.imshow(“test”, output_image.astype(uint8))

這里的網絡輸出是float32,再加上直觀的感覺差異。認為是在astype強轉的過程中,出現了差異。

可以輸出對應點的像素值,發現imwrite和imshow對於浮點數的處理不同。

imwrite寫入的時候按照會有一個四舍五入的過程, 並且有saturation的過程。小於0置為0,大於255置於255。

我遇到的不同最直觀的原因就是在強轉中出現的問題將本應是255的像素值轉換成錯誤的值。

正確的處理應該是這樣。

out_image = np.around(out_image)
out_image[out_image > 255] = 255
out_image[out_image < 0] = 0 # saturation
cv2.imshow("test", out_image)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM