最近在搞畢設,遇到了一個問題。網絡輸出圖像, 但是用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)