颜色空间转化c++代码

rgb转grey:
void RgbToGrey(unsigned char *rgb, double *grey) 
{
   double R = ((double) rgb[0]) / (double)255.0;
   double G = ((double) rgb[1]) / (double)255.0;
   double B = ((double) rgb[2]) / (double)255.0;
   double y = (double)0.212671 * R + (double)0.715160 * G + (double)0.072169 * B;

   if (y > (double)0.008856) {
      grey[0] = (double)116.0 * pow(y, (double)1.0 / (double)3.0) - (double)16.0;
   }
   else {
      grey[0] = (double)903.3 * y;
   }
}

rgb转lvu:
void RgbToLuv(unsigned char *rgb, double *luv)
{
   double L, u, v;
   double R = ((double) rgb[0]) / (double)255.0;
   double G = ((double) rgb[1]) / (double)255.0;
   double B = ((double) rgb[2]) / (double)255.0;
   double x = (double)0.412453 * R + (double)0.357580 * G + (double)0.180423 * B;
   double y = (double)0.212671 * R + (double)0.715160 * G + (double)0.072169 * B;
   double z = (double)0.019334 * R + (double)0.119193 * G + (double)0.950227 * B;

   if (y > 0.008856) {
      L = (double)116.0 * pow(y, (double)1.0 / (double)3.0) - (double)16.0;
   }
   else {
      L = (double)903.3 * y;
   }

   double sum = x + 15 * y + 3 * z;
   if (sum != 0) {
      u = 4 * x / sum, v = 9 * y / sum;
   }
   else {
      u = 4.0, v = (double)9.0 / (double)15.0;
   }

   luv[0] = L;
   luv[1] = 13 * L * (u - (double)0.19784977571475);
   luv[2] = 13 * L * (v - (double)0.46834507665248);
}

rgb转lab:
void RgbToLab(unsigned char *rgb, double *lab)
{
   double R = ((double) rgb[0]) / (double)255.0;
   double G = ((double) rgb[1]) / (double)255.0;
   double B = ((double) rgb[2]) / (double)255.0;
   double X =   0.412453 * R + 0.357580 * G + 0.180423 * B;
   double Y =   0.212671 * R + 0.715160 * G + 0.072169 * B;
   double Z =   0.019334 * R + 0.119193 * G + 0.950227 * B;
   double xr = X / 0.950456, yr = Y / 1.000, zr = Z / 1.088854;

   if (yr > 0.008856) {
      lab[0] = 116.0 * pow(yr, 1.0 / 3.0) - 16.0;
   }
   else {
      lab[0] = 903.3 * yr;
   }

   double fxr, fyr, fzr;
   if (xr > 0.008856) {
      fxr = pow(xr, 1.0 / 3.0);
   }
   else {
      fxr = 7.787 * xr + 16.0 / 116.0;
   }

   if (yr > 0.008856) {
      fyr = pow(yr, 1.0 / 3.0);
   }
   else {
      fyr = 7.787 * yr + 16.0 / 116.0;
   }

   if(zr > 0.008856) {
      fzr = pow(zr, 1.0 / 3.0);
   }
   else {
      fzr = 7.787 * zr + 16.0 / 116.0;
   }

   lab[1] = 500.0 * (fxr - fyr);
   lab[2] = 200.0 * (fyr - fzr);
}

grey转rgb:
void GreyToRgb(double *grey, unsigned char *rgb)
{
   if (grey[0] < (double)0.1) {
      rgb[0] = rgb[1] = rgb[2] = 0;
   }
   else {
      double y;
      if(grey[0] <= (double)7.9996) {
         y = 255 * grey[0] / (double)903.3;
      }
      else {
         y = (grey[0] + (double)16.0) / (double)116.0, y   = 255 * y * y * y;
      }

      rgb[0] = (unsigned char)((y < 0) ? 0 : ((y > 255) ? 255 : y));
      rgb[2] = rgb[1] = rgb[0];
   }
}

grey转luv:
void GreyToLuv(double *grey, double *luv)
{
   luv[0] = grey[0], luv[1] = luv[2] = 0;
}

grey转lab:
void GreyToLab(double *grey, double *lab)
{
   lab[0] = grey[0], lab[1] = lab[2] = 0;
}

luv转rgb:
void LuvToRgb(double *luv, unsigned char *rgb)
{
   if (luv[0] < 0.1) {
      rgb[0] = rgb[1] = rgb[2] = 0;
   }
   else {
      double x, y, z, u, v;

      if (luv[0] <= (double)7.9996) {
         y = luv[0] / (double)903.3;
      }
      else {
         y = (luv[0] + (double)16.0) / (double)116.0, y   = y * y * y;
      }

      u = luv[1] / (13 * luv[0]) + (double)0.19784977571475;
      v = luv[2] / (13 * luv[0]) + (double)0.46834507665248;
      x = 9 * u * y / (4 * v);
      z = (12 - 3 * u - 20 * v) * y / (4 * v);
      double R = (double)3.240479 * x - (double)1.537150 * y - (double)0.498535 * z;
      double G = (double)-0.969256 * x + (double)1.875992 * y + (double)0.041556 * z;
      double B = (double)0.055648 * x - (double)0.204043 * y + (double)1.057311 * z;
      R *= 255, G *= 255, B *= 255;
      rgb[0] = (unsigned char)((R < 0) ? 0 : ((R > 255) ? 255 : R));
      rgb[1] = (unsigned char)((G < 0) ? 0 : ((G > 255) ? 255 : G));
      rgb[2] = (unsigned char)((B < 0) ? 0 : ((B > 255) ? 255 : B));
   }
}

luv转grey:
void LuvToGrey(double *luv, double *grey)
{
   grey[0] = luv[0];
}

lab转rgb:
void LabToRgb(double *lab, unsigned char *rgb)
{
   double X, Y, Z;
   double P = (lab[0] + 16.0) / 116.0;

   if (lab[0] > 7.9996) {
      Y = 1.000 * P * P * P;
   }
   else {
      Y = 1.000 * lab[0] / 903.3;
   }

   double yr = Y / 1.000, fy;
   if (yr > 0.008856) {
      fy = pow(yr, 1.0 / 3.0);
   }
   else {
      fy = 7.787 * yr + 16.0 / 116.0;
   }

   double fx = lab[1] / 500.0 + fy, fz = fy - lab[2] / 200.0;
   if(fx > 0.2069) {
      X = 0.950456 * fx * fx * fx;
   }
   else {
      X = 0.950456 / 7.787 * (fx - 16.0 / 116.0);
   }

   if (fz > 0.2069) {
      Z = 1.088854 * fz * fz * fz;
   }
   else {
      Z = 1.088854 / 7.787 * (fz - 16.0 / 116.0);
   }

   double R = 3.240479 * X - 1.537150 * Y - 0.498535 * Z;
   double G = -0.969256 * X + 1.875992 * Y + 0.041556 * Z;
   double B = 0.055648 * X - 0.204043 * Y + 1.057311 * Z;
   R *= 255, G *= 255, B *= 255;
   rgb[0] = (unsigned char)((R < 0) ? 0 : ((R > 255) ? 255 : R));
   rgb[1] = (unsigned char)((G < 0) ? 0 : ((G > 255) ? 255 : G));
   rgb[2] = (unsigned char)((B < 0) ? 0 : ((B > 255) ? 255 : B));
}

lab转grey:
void LabToGrey(double *lab, double *grey)
{
   grey[0] = lab[0];
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YUV422是一种色彩空间,而RAW_mono是一种图像格式,它只有单色通道。因此,将YUV422转换为RAW_mono需要进行以下步骤: 1. 将YUV422图像分离为Y、U、V三个通道 2. 从Y通道中提取亮度信息 3. 将亮度信息重新组合为RAW_mono格式的图像 下面是一个示例代码,用于将YUV422转换为RAW_mono: ```c++ #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { // 读取YUV422图像 ifstream infile("input.yuv", ios::binary); int width = 640; int height = 480; int y_size = width * height; int uv_size = y_size / 2; char* yuv_data = new char[y_size * 2]; infile.read(yuv_data, y_size * 2); infile.close(); // 将YUV422图像分离为Y、U、V三个通道 char* y_data = new char[y_size]; char* u_data = new char[uv_size]; char* v_data = new char[uv_size]; for (int i = 0; i < y_size; i++) { y_data[i] = yuv_data[i * 2]; } for (int i = 0; i < uv_size; i++) { u_data[i] = yuv_data[y_size + i * 2]; v_data[i] = yuv_data[y_size + i * 2 + 1]; } // 从Y通道中提取亮度信息 char* raw_data = new char[y_size]; for (int i = 0; i < y_size; i++) { raw_data[i] = y_data[i]; } // 将亮度信息重新组合为RAW_mono格式的图像 ofstream outfile("output.raw", ios::binary); outfile.write(raw_data, y_size); outfile.close(); // 释放内存 delete[] yuv_data; delete[] y_data; delete[] u_data; delete[] v_data; delete[] raw_data; return 0; } ``` 在上面的代码中,我们首先读取了YUV422格式的图像数据,然后将其分离为Y、U、V三个通道。接着,我们从Y通道中提取亮度信息,并将其重新组合为RAW_mono格式的图像。最后,将结果写入到一个二进制文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值