簡體   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