为什么OpenCV imread()返回灰度图像,尽管有颜色标志?

9rygscc1  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(135)

我正在使用openCV的imread()读取jp2 file。图像加载,但它总是灰度。
我在文档中看到一些IMREAD_FLAGS可能会导致这种情况,我还知道cv 2可能会将通道顺序更改为BGR。
然而,我相信这些原因都不是这里的问题。我用不同的IMREAD_FLAGS导入图像并保存副本如下:

image = cv2.imread("mypath.jp2", cv2.IMREAD_UNCHANGED) # change flag here
cv2.imwrite("IMREAD_UNCHANGED.png", image) # change file name accordingly

我还使用cv2.cvtColor(image,cv2.COLOR_BGR2RGB)将图像转换为RGB。结果图像大小不同,但结果始终是灰度图像:

此外,我确信这些图像有颜色,因为当用Pillow打开它时,它看起来像这样:

有人能告诉我我在这里做错了什么吗?提前感谢!

yacmzcpb

yacmzcpb1#

当我使用cv.imread(path)(Windows上的OpenCV 4.7.0)时,它给了我三个通道,而不是灰度。我没有检查OpenCV是否删除了任何颜色信息。
如果我请求IMREAD_UNCHANGED,它确实会抱怨:
[错误:0@171.019] global grfmt_jpeg2000_openjpeg.cpp:410 cv::anonymous-namespace'::decodeGrayscaleData OpenJPEG2000:不支持从4分量到4分量的转换,用于灰度图像解码cv.imreadmulti(path, flags=cv.IMREAD_UNCHANGED)`也会发生同样的错误,它通常是多平面图像格式的正确选择(TIFF可以是这样的)。如果没有标志,它只返回一层3通道数据。
所以有可能会有一个bug报告。如果你想归档它,在OpenCV's github上做。
PIL把它读作“RGBA”。那里没有透明度,它只是一个第四频道。
文件名包含“rgbi”,这让我怀疑它是一个多层文件,或者至少第四个通道包含另一个颜色层,而不是“透明度”。
如果你从PIL Image转换到numpy数组,至少你可以得到所有的通道及其数据。

import numpy as np
from PIL import Image

im = Image.open(path)
im = np.asarray(im)

你也可以使用imageio。它会警告你图片太大了,但它确实会加载整个图片。这是一个复杂的库,所以请查看文档中推荐的读取此类文件的方法。

import imageio

im = imageio.read(path)
im.get_data(0) # (10000, 10000, 4)

相关问题