【发布时间】: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_QUALITY和IMWRITE_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