我正在使用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打开它时,它看起来像这样:
有人能告诉我我在这里做错了什么吗?提前感谢!
1条答案
按热度按时间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数组,至少你可以得到所有的通道及其数据。
你也可以使用
imageio
。它会警告你图片太大了,但它确实会加载整个图片。这是一个复杂的库,所以请查看文档中推荐的读取此类文件的方法。