Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy数组中的图像显示为无色_Python_Python 3.x_Numpy_Opencv - Fatal编程技术网

Python numpy数组中的图像显示为无色

Python numpy数组中的图像显示为无色,python,python-3.x,numpy,opencv,Python,Python 3.x,Numpy,Opencv,我想使用OpenCV从numpy数组创建以下2x2图像 我试图用这个代码片段创建它 导入cv2 将numpy作为np导入 蓝色=(255,0,0) 绿色=(0,255,0) 红色=(0,0,255) image=np.array([ [蓝色,绿色], [红色,蓝色] ]) cv2.imwrite('2x2.jpg',图像) 我使用了BGR颜色格式,但是当我查看输出图像时,我看到一个无色的图像 我错过了什么 环境 OpenCV 4.5.1.48 Python 3.9.1 视窗10 我认为您

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

我试图用这个代码片段创建它

导入cv2
将numpy作为np导入
蓝色=(255,0,0)
绿色=(0,255,0)
红色=(0,0,255)
image=np.array([
[蓝色,绿色],
[红色,蓝色]
])
cv2.imwrite('2x2.jpg',图像)
我使用了BGR颜色格式,但是当我查看输出图像时,我看到一个无色的图像

我错过了什么

环境
  • OpenCV 4.5.1.48
  • Python 3.9.1
  • 视窗10

我认为您的问题可能不是指定阵列的数据类型。在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)


我认为您的问题可能不是指定阵列的数据类型。在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)


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

而不是:

cv2.imwrite('2x2.jpg', image)
尝试将其保存为png:

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

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

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

而不是:

cv2.imwrite('2x2.jpg', image)
尝试将其保存为png:

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

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

这并不能解决问题。当您将大小从
(200200)
更改为
(2,2)
时,输出是相同的无色图像。单独指定
dtype
没有任何作用。它对我来说很好。如果删除数据类型,则调整大小将崩溃,并显示OpenCV错误消息。对不起,如果它不适合你。我使用的是Python 3.7.5和OpenCV 3.4.8,我使用的是OpenCV 4.5.1.48,如果删除数据类型,它将生成相同的输出。没有崩溃,这解决不了问题。当您将大小从
(200200)
更改为
(2,2)
时,输出是相同的无色图像。单独指定
dtype
没有任何作用。它对我来说很好。如果删除数据类型,则调整大小将崩溃,并显示OpenCV错误消息。对不起,如果它不适合你。我使用的是Python 3.7.5和OpenCV 3.4.8,我使用的是OpenCV 4.5.1.48,如果删除数据类型,它将生成相同的输出。没有崩溃。对于如此小的图像,
JPEG
编码可能过度压缩了原始数据。使用
cv2.imwrite('2x2.PNG',image)
尝试将文件另存为
PNG
。对于小于jpg 8x8块大小的图像,jpg压缩的好处在于。@fmw42与大小无关,如果平铺此图案,也会发生同样的情况。这是JPEG使用的色度子采样的效果。我认为是4:2;0变体(最常见),这意味着颜色以一半分辨率采样(即2x2瓷砖的一个样本)。看起来很合适,结果似乎只有不同的亮度和相同的色调。OpenCV没有提供直接控制子采样方法的方法,但是有一个副作用——当您同时指定
IMWRITE\u JPEG\u LUMA\u QUALITY
IMWRITE\u JPEG\u CHROMA\u QUALITY
时,它们并不相等,子采样已关闭:|不幸的是,这需要
JPEG\u LIB\u VERSION>=70
,不幸的是,OpenCV附带并用于构建标准版本(至少在Windows上)的库只有版本62。如果需要JPEG格式,Pillow允许直接控制子采样:
Image.fromarray(Image[…,:-1])。保存('2x2_PIL.jpg',quality=100,subsampling=0)
对于如此小的图像,可能是
JPEG
编码过度压缩了原始数据。请尝试将文件另存为
PNG
,而使用
cv2.imwrite('2x2.PNG',image)
。对于小于jpg 8x8块大小的图像,jpg压缩的优点是。@fmw42这与大小无关,如果平铺此图案,也会发生同样的情况。这是JPEG使用的色度子采样的效果。我认为是4:2;0变体(最常见),这意味着颜色采样的分辨率为分辨率的一半(即2x2平铺的一个样本)。似乎很合适,结果似乎只有不同的亮度和相同的色调。这确实说明了为什么JPEG对于这样的合成图像是不好的选择。OpenCV没有提供直接控制子采样方法的方法,但是有一个副作用——当您同时指定
IMWRITE\u JPEG\u LUMA\u质量
IMWRITE\u JPEG\u色度质量时ITY
和它们不相等,子采样被关闭:|不幸的是,这需要
JPEG_LIB_VERSION>=70
,不幸的是,OpenCV附带并用于构建标准版本(至少在Windows上)的库只有版本62。如果需要JPEG格式,Pillow允许直接控制子采样:
Image.fromarray(图像[…,::-1])。保存('2x2_PIL.jpg',质量=100,子采样=0)