繁体   English   中英

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

[英]Convert RGB Color Image to Indexed Color Image Type in OpenCV C++

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

这是我的代码 C++。 这是转换为灰度。

我该怎么办?

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

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

imwrite("save_path", output);

我不相信OpenCVimwrite()支持编写调色板 PNG。 一种选择可能是编写您喜欢的任何其他格式,然后使用ImageMagick转换为调色板 PNG。

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

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

magick input.png PNG8:result.png

ImageMagick v7 之前,这将是:

convert input.png PNG8:result.png

PNG8:前缀强制一个调色板的结果。


如果您不想在之后显式转换文件,则可以使用OpenCVimwrite()将它们编写为文件系统中的 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 位蓝色等等。

我通过手动编码/解码 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM