【问题标题】:Image from numpy array appears colorless来自 numpy 数组的图像显示为无色
【发布时间】:2021-07-22 06:29:36
【问题描述】:

我想使用 OpenCV 从 numpy 数组创建以下 2x2 图像。

我尝试用这段代码 sn-p 创建它。

import cv2
import numpy as np

blue = (255, 0, 0)
green = (0, 255, 0)
red = (0, 0, 255)

image = np.array([
    [blue, green],
    [red, blue]
])

cv2.imwrite('2x2.jpg', image)

我使用了 BGR 颜色格式,但是当我查看输出图像时,我看到的是无色图像。

我错过了什么?

环境

  • OpenCV 4.5.1.48
  • Python 3.9.1
  • Windows 10

【问题讨论】:

  • 对于这么小的图像,可能是JPEG 编码过度压缩了您的原始数据。尝试将文件另存为PNG,使用cv2.imwrite('2x2.png', image)
  • 关于小于 jpg 8x8 块大小的图像的 jpg 压缩的要点。
  • @fmw42 这与大小无关,如果您平铺此图案,也会发生同样的情况。这是JPEG使用的色度二次采样的效果。我认为 4:2;0 变体(最常见),这意味着颜色以分辨率的一半进行采样(即一个样本用于 2x2 平铺)。似乎很合适,结果似乎只有不同的亮度和相同的色调。真正说明了为什么 JPEG 对于这样的合成图像是不好的选择。
  • OpenCV 没有提供直接控制子采样方法的方法,但是有一个副作用——当您同时指定 IMWRITE_JPEG_LUMA_QUALITYIMWRITE_JPEG_CHROMA_QUALITY 并且它们不相等时,会启用子采样关闭:github.com/opencv/opencv/blob/3.4/modules/imgcodecs/src/… |不幸的是,这需要JPEG_LIB_VERSION >= 70,遗憾的是,OpenCV 附带的用于构建标准版本(至少在 Windows 上)的库只有 62 版。
  • 如果需要 JPEG 格式,Pillow 允许直接控制子采样:Image.fromarray(image[...,::-1]).save('2x2_PIL.jpg', quality=100, subsampling=0)

标签: python python-3.x numpy opencv


【解决方案1】:

我认为 jpg 压缩方法在一些像素形状的图像上会导致此问题

代替:

cv2.imwrite('2x2.jpg', image)

尝试将其保存为 png:

cv2.imwrite('2x2.png', image)

并始终在图像阵列上使用uint8

【讨论】:

    【解决方案2】:

    我相信您的问题可能不是为您的数组指定 dtype。以下在 Python/OpenCV 中对我来说很好。

    import cv2
    import numpy as np
    
    blue = (255, 0, 0)
    green = (0, 255, 0)
    red = (0, 0, 255)
    
    image = np.array([
        [blue, green],
        [red, blue]
    ], dtype=np.uint8)
    
    image = cv2.resize(image, (200,200), interpolation = cv2.INTER_AREA)
    
    cv2.imwrite('2x2.jpg', image)
    

    【讨论】:

    • 这并不能解决问题。当您将大小从 (200, 200) 更改为 (2, 2) 时,输出是相同的无色图像。单独指定 dtype 没有任何作用。
    • 它对我来说很好用。如果我删除 dtype,resize 会因 OpenCV 错误消息而崩溃。对不起,如果它不适合你。我正在使用 Python 3.7.5 和 OpenCV 3.4.8
    • 我使用 OpenCV 4.5.1.48,如果我删除 dtype,它会产生相同的输出。没有崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多