在OpenCV C ++中将RGB彩色图像转换为索引彩色图像类型

时间:2019-02-27 11:53:12

标签: c++ opencv

我想将rgb图像转换为索引颜色类型。

这是我的Code C ++。这将转换为灰度。

我该怎么办?

Mat black_background = imread("image_path", IMREAD_COLOR); 

Mat output;
cvtColor(black_background, output, cv::COLOR_RGB2GRAY);

imwrite("save_path", output);

2 个答案:

答案 0 :(得分:2)

我不相信 OpenCV imwrite()支持编写浅化的PNG。一种选择是写成您喜欢的任何其他格式,然后使用 ImageMagick 转换为浅绿色的PNG。

ImageMagick 包含在大多数Linux发行版中,并且可用于macOS和Windows。

因此,在Windows的终端或命令提示符下:

magick input.png PNG8:result.png

ImageMagick 的v7之前的版本是

convert input.png PNG8:result.png

PNG8:前缀会强制显示结果。


如果您以后不必再明确地转换文件,则可以使用 OpenCV imwrite()作为文件系统中的PNG文件来编写它们,然后使用C ++的system()获取 ImageMagick 进行转换:

#include <stdlib.h>

...

imwrite('result.png', image);

// Delegate conversion to palette image to ImageMagick
system("magick result.png PNG8:result.png');

对于更急/敏锐的读者:

  • 是的,与其他Unix实用程序不同,可以使用相同的文件作为 ImageMagick 的输出来输入,并且不必担心损坏,因为可以完全读取文件在处理然后写出来之前,

  • 是的, ImageMagick 将隐式处理将图像中的颜色减少为调色板版本所需的量化,

  • 是的,您可以使用其他前缀强制使用其他类型的PNG文件,例如RGB24:result.png将产生RGB888输出,RGB32:result.png将产生RGBA8888输出,RGB48:result.png将产生16位红色,16位绿色和16位蓝色,等等。

答案 1 :(得分:0)

我为索引彩色图像写下了自己的编码器/解码器,通过手动编码/解码 BMP 和 PNG 格式。它对我很有效(在生产环境中)。

代码思路:手动查看BMP/PNG里面的块(例如png中的PLTE块)。示例代码如下,您也可以自己编写/修改。

代码的使用:

// sample usage
int main() {
  Mat image_index = ...;
  Mat palette = ...;
  vector<uchar> encoded_bytes = imencode_palette_bmp(image_index, palette);
}

完整代码(要点):https://gist.github.com/fzyzcjy/8b1736a294aab81eb86243bfb6fdc260