【问题标题】:cv2.imshow and cv2.imwritecv2.imshow 和 cv2.imwrite
【发布时间】:2023-03-21 04:28:01
【问题描述】:

有人可以解释为什么 OpenCV imshowimwrite 函数似乎会产生完全不同的图像吗?

第一张图片对应imshow,第二张图片对应imwriteResult 是一个 0 到 255 之间的浮点值数组。

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

【问题讨论】:

  • 1 拍了第一张照片并尝试了,我得到了两者的第一张照片(但我在这里使用 opencv3.0)
  • 我使用 Python 3.3 版
  • 你使用的是哪个opencv版本?它是使用opencv的png库还是系统中的东西?试试:cv2.getBuildInformation()
  • imwrite 根本不处理浮动图像。
  • result.astype(np.uint8) 不会更改结果对象。您需要将该操作的返回值分配给某物。

标签: python opencv


【解决方案1】:

我在 OpenCV 2.4.8 中使用了以下 (c++) 代码:

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。

【讨论】:

  • 但是使用 result = result.astype(np.uint8) 两个图像现在看起来相同,值在 [0,255] 之间,其他一些项目也是如此。
  • 哦,所以(稀疏的)第一张图像实际上是在浮动图像中饱和任何 > 1 到 1 的结果?
  • @berak 是的,第一张图片已经饱和。
  • @Matthias 如果您将浮点图像转换为无符号字符而不修改值,那么您将得到一个具有 [0,255] 值的无符号字符图像,因此这两个函数具有相同的行为。如果不转换类型,则会得到一个值为 [0,255] 的浮点图像,因此这两个函数具有不同的行为。
  • @Matthias 是的,密集的图像是正确的。而uint8 是一个 8 位的无符号整数,即unsigned char。标准unsigned int 通常是 32 位;)
【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 2017-11-17
    • 2018-11-13
    • 2020-12-13
    • 2016-11-30
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多