【问题标题】:cv2.imshow() function displays correct image but while saving it using cv2.imwrite() funtion, its saves all black pixel image?cv2.imshow() 函数显示正确的图像,但在使用 cv2.imwrite() 函数保存时,它保存了所有黑色像素图像?
【发布时间】:2020-12-03 09:51:39
【问题描述】:

我正在尝试将输入图像的大小调整为 736 x 736 作为输出大小,同时保留原始图像的纵横比并在此过程中添加零填充。 函数image_resize_add_padding() 工作正常,并且正在做我想做的事情。使用cv2.imshow() 函数显示时调整大小的图像看起来不错 但是在使用cv2.imwrite() 函数保存时,它似乎是一个全黑的图像。

如何在显示时保存正确的图像?

import cv2
import numpy as np


def image_resize_add_padding(image, target_size):
    ih, iw = target_size
    h,  w, _ = image.shape

    scale = min(iw/w, ih/h)
    nw, nh = int(scale * w), int(scale * h)
    image_resized = cv2.resize(image, (nw, nh))

    image_paded = np.full(shape=[ih, iw, 3], fill_value=128.0)
    dw, dh = (iw - nw) // 2, (ih-nh) // 2
    image_paded[dh:nh+dh, dw:nw+dw, :] = image_resized
    image_paded = image_paded / 255.

    return image_paded


input_size = 736
image_path = "test_image.jpg"
original_image = cv2.imread(image_path)
output_image = image_resize_add_padding(
    np.copy(original_image), [input_size, input_size])
cv2.imshow('image', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('test_output.jpg', output_image)

【问题讨论】:

  • 你试过这篇文章的步骤了吗? stackoverflow.com/questions/19239381/…
  • @MightyDiffy 感谢您的参考。上面帖子中的最佳答案是将输出图像乘以 255 以获得正确的范围。我之前确实尝试过,或者我可以删除将 image_paded 输出除以 255 的部分。但它没有用。

标签: python opencv image-resizing


【解决方案1】:

imshow 函数和使用 JPG 格式的 imwrite 处理浮点图像缓冲区的方式不同。

您将图像除以255. 的那一行将图像格式更改为浮点数。为了让 JPG writer 正确处理图像数据,例如,您可以在调用 imwrite 之前将缓冲区转换为 uint8(并确保值在 0-255 范围内)。

编辑:

代码将图像转换为浮点数,并将范围更改为 0-1。目前尚不清楚为什么要这样做,但如果您想保持功能不变,您可以为imwrite 调用准备图像,如下所示:

output_image = (output_image * 255).astype('uint8')

【讨论】:

  • 是的,只要摆脱 image_paded = image_paded / 255. 就可以了。
  • @etienne-d 根据您的建议,我通过将 output_image.astype('uint8') 添加为 cv2.imwrite('test_output.jpg', output_image) 来转换缓冲区,但结果相同(全黑图像。)我错过了什么吗?
  • @Doyousketch2 我之前确实尝试过,但没有成功。删除 image_paded = image_paded / 255.part 将进一步显示错误图像(即平面白色图像)并保存全黑图像。您可以尝试通过任何示例图像破坏上面的代码并自己查看。
  • 您的测试图像是普通的 rgb .JPG,还是具有透明度?我知道从历史上看,CV2 在 jpg 上存在问题。多年来,他们没有增加阅读这些内容的能力。认为人们仍然避免它,因为它引入了人工制品。在删除该行的情况下运行完全相同的代码,并且在 .PNG 上很好
  • @EtienneD。非常感谢您的更新版本。它就像一个魅力。
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 2020-02-27
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多