`OpenCV`中`cv2.imshow`和`cv2.imwrite`結果不一致問題2020-07-03

  • 2020 年 7 月 4 日
  • AI

原文//www.jianshu.com/p/cad76e90757e

簡述

本節將針對使用OpenCVcv2.imshowcv2.imwrite結果不一致問題進行小結

問題復現過程

#圖片路徑
sta = './Sketch/o5MuJ5T0Z0uQLT-z883VQsmx1bSA/15438410304182994.jpg'
#使用模型
net = cv2.dnn.readNetFromTorch('models/eccv16/composition_vii.t7')
image = cv2.imread(sta)
image = imutils.resize(image, width=600)
(h, w) = image.shape[:2]

blob = cv2.dnn.blobFromImage(image, 1.0, (w, h),
    (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
output = net.forward()

output = output.reshape((3, output.shape[2], output.shape[3]))
output[0] += 103.939
output[1] += 116.779
output[2] += 123.680
output /= 255.0
output = output.transpose(1, 2, 0)
#窗體顯示
cv2.imshow("output", output)
cv2.waitKey(0)
#保存本地
cv2.imwrite('output.png', output)

image
image
image

解決過程

1、測試圖片進行常規操作imshowimwrite是否有區別,測試發現無明顯區別
2、檢索是否有類似問題,是否兩方法實現原理不同,後與stackoverflow發現有類似問題
stackoverflow.com相關鏈接:cv2.imshow and cv2.imwrite

image

測試修改對比

#圖片路徑
sta = './Sketch/o5MuJ5T0Z0uQLT-z883VQsmx1bSA/15438410304182994.jpg'
#使用模型
net = cv2.dnn.readNetFromTorch('models/eccv16/composition_vii.t7')
image = cv2.imread(sta)
image = imutils.resize(image, width=600)
(h, w) = image.shape[:2]

blob = cv2.dnn.blobFromImage(image, 1.0, (w, h),
    (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
output = net.forward()

output = output.reshape((3, output.shape[2], output.shape[3]))
output[0] += 103.939
output[1] += 116.779
output[2] += 123.680
# 由於imshow、imwrite兩個函數的範圍期望不同,使用imshow需除以255,imwrite則不需要
# output /= 255.0
output = output.transpose(1, 2, 0)
#窗體顯示
cv2.imshow("output", output)
cv2.waitKey(0)
#保存本地
cv2.imwrite('output.png', output)

image
image

作者:_過橋
鏈接://www.jianshu.com/p/cad76e90757e
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。