CImg:一行程式碼實現RGB轉YUV
阿新 • • 發佈:2019-01-07
CImg提供了豐富的色彩空間轉換功能,允許在不同的顏色空間(RGB,sRGB,YUV,HSL,HSV,YCbCr,CMY,CMYK,XYZ
)之間的轉換,使用非常簡單以下是將一個RGB
影象轉為YUV
的示例。
#include <CImg.h>
using namespace cimg_library;
/**
* 載入JPEG影象檔案並轉為YUV色彩空間
* @param jpeg_file
* @return
*/
CImg<unsigned char> load_jpeg_yuv(const char* jpeg_file)
{
// 因為RGB 轉 YUV 是浮點運算,所以這裡定義float型別的CImg物件
CImg<float> yuv;
// 載入一個JPEG檔案到記憶體,
// NOTE:必須有libjpeg支援
yuv.load_jpeg(jpeg_file);
// RGB轉為YUV
yuv.RGBtoYUV();
// RGB轉YUV後,每個畫素值都是歸一化的浮點數(0.0~1.0)
// 所以需要將浮點數轉為0~255之間的值,在這裡 *= 操作符將所有影象矩陣中所有畫素值乘以255。
yuv *= 255;
// 基於float型別的CImg物件,重新構造一個unsigned char型別的CImg物件
return CImg<unsigned char>(yuv, false);
}
上面的程式碼如果簡寫,只要一行就完成.
CImg<unsigned char> load_jpeg_yuv(const char* jpeg_file)
{
return CImg<unsigned char>(CImg<float>().load_jpeg(jpeg_file).RGBtoYUV()*255,false);
}
如果你想實現其他色彩空間的轉稍稍看一下CImg.h原始碼就明白了。
如果想從YUV影象中分別獲取,Y,U,V分量的資料該怎麼辦呢?
如下程式碼以std::string
物件返回Y分量(灰度影象)資料
#include <string>
std::string get_gray_matrix (const char* jpeg_file)
{
CImg<unsigned char> yuv = load_jpeg_yuv(jpeg_file);
// CImg的影象資料是按通道儲存的,所以獲取不同通道的資料只需要data函式算出通道起始地址就可以了。
// 返回 Y分量(灰度影象矩陣)
// U分量為data(0,0,0,1),V分量為data(0,0,0,2)
unsigned char* y = yuv.data(0,0,0,0);
return std::string((char*)y, yuv._width * yuv._height);
}
NOTE:
CImg
設計的目標是一個方便簡單的影象處理工具,效能並不是追求的目標,
上面的色彩空間轉換雖然簡單,但在程式碼執行效率上並不可取,
所以需要考慮程式碼效能的應用場景,使用CImg
就不太合適了。