cv2.imshow 和 cv2.imwrite
有人能解释一下为什么OpenCV的imshow
和imwrite
函数显示的图像完全不同吗?
第一张图片是用imshow
显示的,第二张图片是用imwrite
保存的。Result
是一个包含0到255之间浮点数值的数组。
**result = result.astype(np.uint8)**
cv2.imshow('img', result)
cv2.imwrite('img.png', result)
2 个回答
2
因为你在使用Python,这可能会对你有帮助:
def showimg(img):
cv2.namedWindow("test", cv2.WINDOW_NORMAL)
img = np.array(img,dtype=float)/float(255)
cv2.imshow('test',img)
cv2.resizeWindow('test',600,600)
cv2.waitKey(0)
14
我使用了以下的 (c++) 代码和 OpenCV 2.4.8:
cv::Mat_<float> img(300,300);
cv::theRNG().fill(img,cv::RNG::UNIFORM,0,255);
cv::imshow("Img",img);
cv::waitKey();
cv::imwrite("test.png",img);
结果生成了以下图像:
这是用 imshow
显示的。
这是用 imwrite
保存的。
这主要是因为这两个函数对数据范围的期望不同,imwrite
总是期望数据在 [0,255] 的范围内,而 imshow
对浮点数期望在 [0,1] 的范围内,对无符号字符则是 [0,255]。
为了用 imshow
正确显示输出,你需要把浮点图像的数据范围从 [0,255] 降到 [0,1]。你可以使用 convertTo
和合适的缩放因子来实现,或者简单地把图像除以 255。