【问题标题】:Convert RGB Color Image to Indexed Color Image Type in OpenCV C++在 OpenCV C++ 中将 RGB 彩色图像转换为索引彩色图像类型
【发布时间】:2019-07-21 03:22:32
【问题描述】:

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

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

我该怎么办?

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

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

imwrite("save_path", output);

【问题讨论】:

标签: c++ opencv


【解决方案1】:

我不相信 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++ 的 @987654327 @ 让 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 位蓝色等等。

【讨论】:

【解决方案2】:

我通过手动对 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

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多