cv2.imshow 和 cv2.imwrite

8 投票
2 回答
20869 浏览
提问于 2025-04-17 22:51

有人能解释一下为什么OpenCV的imshowimwrite函数显示的图像完全不同吗?

第一张图片是用imshow显示的,第二张图片是用imwrite保存的。Result是一个包含0到255之间浮点数值的数组。

**result = result.astype(np.uint8)**
cv2.imshow('img', result)
cv2.imwrite('img.png', result)

Target 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。

撰写回答