/*
* ColorSpace.cpp
*
* Created on: 2016年7月1日
* Author: Administrator
*/
#include "stdafx.h"
#include "ColorSpace.hpp"
#include <iostream>
using namespace std;
#define MAX2(a, b) ( (a) > (b) ) ? (a) : (b)
#define MAX3(a,b,c) ( ( (a) > (b) ) ? MAX2( a, c) : MAX2( b, c ) )
#define MIN2(a, b) ( (a) < (b) ) ? (a) : (b)
#define MIN3(a,b,c) ( ( (a) < (b) ) ? MIN2( a, c ) : MIN2( b, c ) )
#define SWAP(a, b, t) do { t = a; a = b; b = t; } while(0)
#define CLIP_RANGE(value, min, max) ( (value) > (max) ? (max) : (((value) < (min)) ? (min) : (value)) )
#define COLOR_RANGE(value) CLIP_RANGE(value, 0, 255)
namespace cv {
/**
* Convert BGR to Lab
*
* @param bgr [in] pointer to pixel data in Blue-Green-Red format, each channel's value range [0, 255]
* @param lab [out] pointer to pixel data in L-a-b format
* L, value range [0, 1]
* a, value range [0, 1]
* b, value range [0, 1]
*/
void BGR2Lab(const uchar *bgr, float *lab)
//void rgb2lab( float R, float G, float B, float & l_s, float &a_s, float &b_s )
{
float var_R = bgr[2] /255.0;
float var_G = bgr[1] /255.0;
float var_B = bgr[0] /255.0;
if ( var_R > 0.04045 ) var_R = pow( (( var_R + 0.055 ) / 1.055 ), 2.4 );
else var_R = var_R / 12.92;
if ( var_G > 0.04045 ) var_G = pow( ( ( var_G + 0.055 ) / 1.055 ), 2.4);
else var_G = var_G / 12.92;
if ( var_B > 0.04045 ) var_B = pow( ( ( var_B + 0.055 ) / 1.055 ), 2.4);
else var_B = var_B / 12.92;
var_R = var_R * 100.;
var_G = var_G * 100.;
var_B = var_B * 100.;
//Observer. = 2°, Illuminant = D65
float X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805;
float Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722;
float Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505;
float var_X = X / 95.047 ; //ref_X = 95.047 Observer= 2°, Illuminant= D65
float var_Y = Y / 100.000; //ref_Y = 100.000
float var_Z = Z / 108.883; //ref_Z = 108.883
if ( var_X > 0.008856 ) var_X = pow(var_X , ( 1./3. ) );
else var_X = ( 7.787 * var_X ) + ( 16. / 116. );
if ( var_Y > 0.008856 ) var_Y = pow(var_Y , ( 1./3. ));
else var_Y = ( 7.787 * var_Y ) + ( 16. / 116. );
if ( var_Z > 0.008856 ) var_Z = pow(var_Z , ( 1./3. ));
else var_Z = ( 7.787 * var_Z ) + ( 16. / 116. );
lab[0] = ( 116. * var_Y ) - 16.;
lab[1] = 500. * ( var_X - var_Y );
lab[2] = 200. * ( var_Y - var_Z );
}
/**
* Convert Lab to BGR
*
* @param lab [in] pointer to pixel data in L-a-b format
* L, value range [0, 1]
* a, value range [0, 1]
* b, value range [0, 1]
* @param bgr [out] pointer to pixel data in Blue-Green-Red format, each channel's value range [0, 255]
*/
void Lab2BGR(const float *lab, uchar *bgr)
//http://www.easyrgb.com/index.php?X=MATH&H=08#text8
//void lab2rgb( float l_s, float a_s, float b_s, float& R, float& G, float& B )
{
float var_Y = ( lab[0] + 16. ) / 116.;
float var_X = lab[1] / 500. + var_Y;
float var_Z = var_Y - lab[2] / 200.;
if ( pow(var_Y,3) > 0.008856 ) var_Y = pow(var_Y,3);
else var_Y = ( var_Y - 16. / 116. ) / 7.787;
if ( pow(var_X,3) > 0.008856 ) var_X = pow(var_X,3);
else var_X = ( var_X - 16. / 116. ) / 7.787;
if ( pow(var_Z,3) > 0.008856 ) var_Z = pow(var_Z,3);
else var_Z = ( var_Z - 16. / 116. ) / 7.787;
float X = 95.047 * var_X ; //ref_X = 95.047 Observer= 2°, Illuminant= D65
float Y = 100.000 * var_Y ; //ref_Y = 100.000
float Z = 108.883 * var_Z ; //ref_Z = 108.883
var_X = X / 100. ; //X from 0 to 95.047 (Observer = 2°, Illuminant = D65)
var_Y = Y / 100. ; //Y from 0 to 100.000
var_Z = Z / 100. ; //Z from 0 to 108.883
float var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986;
float var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415;
float var_B = var_X * 0.0557 + var_Y * -0.2040 + var_Z * 1.0570;
if ( var_R > 0.0031308 ) var_R = 1.055 * pow(var_R , ( 1 / 2.4 )) - 0.055;
else var_R = 12.92 * var_R;
if ( var_G > 0.0031308 ) var_G = 1.055 * pow(var_G , ( 1 / 2.4 ) ) - 0.055;
else var_G = 12.92 * var_G;
if ( var_B > 0.0031308 ) var_B = 1.055 * pow( var_B , ( 1 / 2.4 ) ) - 0.055;
else var_B = 12.92 * var_B;
bgr[2] = var_R * 255.;
bgr[1] = var_G * 255.;
bgr[0] = var_B * 255.;
}
/**
* Convert RGB to Lab
*
* @param R [in] red, value range [0, 255]
* @param G [in] green, value range [0, 255]
* @param B [in] blue, value range [0, 255]
* @param L [out] L, value range [0, 1]
* @param a [out] a, value range [0, 1]
* @param b [out] b, value range [0, 1]
*/
void RGB2Lab(uchar R, uchar G, uchar B, float *L, float *a, float *b)
{
float lab[3];
uchar bgr[3];
bgr[0] = B; bgr[1] = G; bgr[2] = R;
BGR2Lab(bgr, lab);
*L = lab[0];
*a = lab[1];
*b = lab[2];
}
/**
* Convert Lab to RGB
*
* @param L [in] L, value range [0, 1]
* @param a [in] a, value range [0, 1]
* @param b [in] b, value range [0, 1]
* @param R [out] red, value range [0, 255]
* @param G [out] green, value range [0, 255]
* @param B [out] blue, value range [0, 255]
*/
void Lab2RGB(float L, float a, float b, uchar *R, uchar *G, uchar *B)
{
float lab[3];
uchar bgr[3];
lab[0] = L; lab[1] = a; lab[2] = b;
Lab2BGR(lab, bgr);
*R = bgr[2];
*G = bgr[1];
*B = bgr[0];
}
/**
* Convert RGB to CMYK
*
* @param bgr [in] pointer to pixel data in Blue-Green-Red format, each channel's value range [0, 255]
* @param cmyk [out] pointer to pixel data in Cyan-Magenta-Yellow-Black format
* cyan, value range [0, 1]
* magenta, value range [0, 1]
* yellow, value range [0, 1]
* black, value range [0, 1]
*/
void BGR2CMYK(const uchar *bgr, float *cmyk)
{
float r1 = bgr[2] / 255.0;
float g1 = bgr[1] / 255.0;
float b1 = bgr[0] / 255.0;
cmyk[3] = 1 - MAX3(r1, g1, b1);
cmyk[0] = (1 - r1 - cmyk[3]) / (1 - cmyk[3]);
cmyk[1] = (1 - g1 - cmyk[3]) / (1 - cmyk[3]);
cmyk[2] = (1 - b1 - cmyk[3]) / (1 - cmyk[3]);
}
/**
* Convert CYMK to BGR
*
* @param cmyk [in] pointer to pixel data in Cyan-Magenta-Yellow-Black format
* cyan, value range [0, 1]
* magenta, value range [0, 1]
* yellow, value range [0, 1]
* black, value range [0, 1]
* @param bgr [out] pointer to pixel data in Blue-Green-Red format, each channel's value range [0, 255]
*/
void CMYK2BGR(const float *cmyk, uchar *bgr)
{
bgr[2] = cvRound(255.0 * (1 - cmyk[0]) * (1 - cmyk[3]));
bgr[1] = cvRound(255.0 * (1 - cmyk[1]) * (1 - cmyk[3]));
bgr[0] = cvRound(255.0 * (1 - cmyk[2]) * (1 - cmyk[3]));
}
/**
* Convert RGB to CMYK
*
* @param R [in] red, value range [0, 255]
* @param G [in] green, value range [0, 255]
* @param B [in] blue, value range [0, 255]
* @param C [out] cyan, value range [0, 1]
* @param M [out] magenta, value range [0, 1]
* @param Y [out] yellow, value range [0, 1]
* @param K [out] black, value range [0, 1]
*/
void RGB2CMYK(uchar R, uchar G, uchar B, float *C, float *M, float *Y, float *K)
{
float cmyk[4];
uchar bgr[3];
bgr[0] = B; bgr[1] = G; bgr[2] = R;
BGR2CMYK(bgr, cmyk);
*C = cmyk[0];
*M = cmyk[1];
*Y = cmyk[2];
*K = cmyk[3];
}
/**
* Convert CMYK to RGB
*
* @param C [in] cyan, value range [0, 1]
* @param M [in] magenta, value range [0, 1]
* @param Y [in] yellow, value range [0, 1]
* @param K [in] black, value range [0, 1]
* @param R [out] red, value range [0, 25
没有合适的资源?快使用搜索试试~ 我知道了~
颜色模型互转 rgb hsl lab hsv
共5个文件
cpp:3个
hpp:2个
5星 · 超过95%的资源 需积分: 21 24 下载量 25 浏览量
2018-04-30
05:10:12
上传
评论 2
收藏 7KB RAR 举报
温馨提示
颜色模型互转 rgb hsl lab hsv, c++编写,亲测好用
资源推荐
资源详情
资源评论
收起资源包目录
hsl.rar (5个子文件)
ColorSpace.hpp 7KB
HSL.hpp 1KB
HSL.cpp 5KB
main.cpp 2KB
ColorSpace.cpp 15KB
共 5 条
- 1
资源评论
- 一朝英雄拔剑起2020-07-26非常好,转换的结果也是正确的
- 血虐丘比特2020-11-24不错的资源
ethan.YL
- 粉丝: 2
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功