RGB to HSI、CMYK的代码实现

前言:

在之前博文的基础上,我使用OpenCV2实现了RGB颜色空间向HIS、CMYK转换的代码。下列链接为各种经典颜色空间的介绍及转换公式的介绍。

http://blog.csdn.net/solomon1558/article/details/43772147

1. RGB to HIS

HSI与RGB颜色空间可以进行相互转换。RGB转换到HSI 的计算公式如下:首先给定RGB颜色空间的值(R,G,B),其中R,G,B∈[ 0,2 5 5],则转换到HSI  空间的(H,S,I)值的计算如下:设将(R ,G ,B)归一化得(R',G',B')为:

int rgb2hsi(Mat &image,Mat &hsi){

if(!image.data){

cout<

return -1;

}

int nl = image.rows;

int nc = image.cols;

if(image.isContinuous()){

nc = nc*nl;

nl = 1;

}

for(int i = 0;i < nl;i++){

uchar *src = image.ptr(i);

uchar *dst = hsi.ptr(i);

for(int j = 0;j < nc;j++){

float b = src[j*3]/255.0;

float g = src[j*3+1]/255.0;

float r = src[j*3+2]/255.0;

float num = (float)(0.5*((r-g)+(r-b)));

float den = (float)sqrt((r-g)*(r-g)+(r-b)*(g-b));

float H,S,I;

if(den == 0){//分母不能为0

H = 0;

}

else{

double theta = acos(num/den);

if(b <= g)

H = theta/(PI*2);

else

H = (2*PI - theta)/(2*PI);

}

double minRGB = min(min(r,g),b);

den = r+g+b;

if(den == 0)//分母不能为0

S = 0;

else

S = 1 - 3*minRGB/den;

I = den/3.0;

//将S分量和H分量都扩充到[0,255]区间以便于显示;

//一般H分量在[0,2pi]之间,S在[0,1]之间

dst[3*j] = H*255;

dst[3*j+1] = S*255;

dst[3*j+2] = I*255;

}

}

return 0;

}

【注】:

程序中将S分量和H分量都扩充到[0,255]区间以便于显示;

一般H分量在[0,2pi]之间,S在[0,1]之间。

2.   RGB to CMYK

给定RGB颜色空间的值(R,G,B),其中R,G ,B∈ [0, 2 5 5],则转换到CMYK 空间的(C,M,Y,K)值的计算如下:

【注】式中,maxG是每个矢量分量的最大允许值(255);C , M , Y , K ∈ [ 0,255]。

int rgb2cmyk( Mat &image,Mat &cmyk){

if(!image.data){

cout<

return -1;

}

int nl = image.rows;//行数

int nc = image.cols;//列数

if(image.isContinuous()){//没有额外的填补像素

nc = nc*nl;

nl = 1;//It is now a 1D array

}

//对于连续图像,本循环只执行1次

for(int i=0;i

uchar *data = image.ptr(i);

uchar *dataCMYK = cmyk.ptr(i);

for(int j = 0;j < nc;j++){

uchar b = data[3*j];

uchar g = data[3*j+1];

uchar r = data[3*j+2];

uchar c = 255 - r;

uchar m = 255 - g;

uchar y = 255 - b;

uchar k = min(min(c,m),y);

dataCMYK[4*j] = c - k;

dataCMYK[4*j+1] = m - k;

dataCMYK[4*j+2] = y - k;

dataCMYK[4*j+3] = k;

}

}

return 0;

}

3. 完整的工程

#include

#include

#include

#include

#define PI 3.1416

#define min(a,b) (a

using namespace std;

using namespace cv;

int rgb2hsi(Mat &image,Mat &hsi){

if(!image.data){

cout<

return -1;

}

int nl = image.rows;

int nc = image.cols;

if(image.isContinuous()){

nc = nc*nl;

nl = 1;

}

for(int i = 0;i < nl;i++){

uchar *src = image.ptr(i);

uchar *dst = hsi.ptr(i);

for(int j = 0;j < nc;j++){

float b = src[j*3]/255.0;

float g = src[j*3+1]/255.0;

float r = src[j*3+2]/255.0;

float num = (float)(0.5*((r-g)+(r-b)));

float den = (float)sqrt((r-g)*(r-g)+(r-b)*(g-b));

float H,S,I;

if(den == 0){//分母不能为0

H = 0;

}

else{

double theta = acos(num/den);

if(b <= g)

H = theta/(PI*2);

else

H = (2*PI - theta)/(2*PI);

}

double minRGB = min(min(r,g),b);

den = r+g+b;

if(den == 0)//分母不能为0

S = 0;

else

S = 1 - 3*minRGB/den;

I = den/3.0;

//将S分量和H分量都扩充到[0,255]区间以便于显示;

//一般H分量在[0,2pi]之间,S在[0,1]之间

dst[3*j] = H*255;

dst[3*j+1] = S*255;

dst[3*j+2] = I*255;

}

}

return 0;

}

int rgb2cmyk( Mat &image,Mat &cmyk){

if(!image.data){

cout<

return -1;

}

int nl = image.rows;//行数

int nc = image.cols;//列数

if(image.isContinuous()){//没有额外的填补像素

nc = nc*nl;

nl = 1;//It is now a 1D array

}

//对于连续图像,本循环只执行1次

for(int i=0;i

uchar *data = image.ptr(i);

uchar *dataCMYK = cmyk.ptr(i);

for(int j = 0;j < nc;j++){

uchar b = data[3*j];

uchar g = data[3*j+1];

uchar r = data[3*j+2];

uchar c = 255 - r;

uchar m = 255 - g;

uchar y = 255 - b;

uchar k = min(min(c,m),y);

dataCMYK[4*j] = c - k;

dataCMYK[4*j+1] = m - k;

dataCMYK[4*j+2] = y - k;

dataCMYK[4*j+3] = k;

}

}

return 0;

}

int main(){

Mat img = imread("E:\\CV视频处理工作室\\Test_Photo\\lena_1.jpg");

if(!img.data){

cout<

return -1;

}

Mat img_cmyk,img_hsi;

Mat img_hsv;

vector vecRgb,vecHsi,vecHls,vecHsv,vecCmyk;

img_hsv.create(img.rows,img.cols,CV_8UC3);

Mat img_hls;

img_hls.create(img.rows,img.cols,CV_8UC3);

//生成与输入图像尺寸一样的4通道cmyk图像

img_cmyk.create(img.rows,img.cols,CV_8UC4);

img_hsi.create(img.rows,img.cols,CV_8UC3);

rgb2cmyk(img,img_cmyk);

rgb2hsi(img,img_hsi);

cvtColor(img,img_hsv,CV_BGR2HSV);

cvtColor(img,img_hls,CV_BGR2HLS);

split(img_cmyk,vecCmyk);

split(img_hsi,vecHsi);

cout<

for(int i=0;i<3;i++){

cout<(0,0)[i]<

}

cout<

for(int i=0;i<4;i++){

cout<(0,0)[i]<

}

int a = min(min(24,32),16);

cout<

namedWindow("RGB_Image");

namedWindow("CMYK_Image");

//namedWindow("HSV_Image");

//namedWindow("HLS_Image");

namedWindow("HSI_Image");

namedWindow("CMYK_C");

namedWindow("CMYK_M");

namedWindow("CMYK_Y");

namedWindow("CMYK_K");

imshow("CMYK_C",vecCmyk[0]);

imshow("CMYK_M",vecCmyk[1]);

imshow("CMYK_Y",vecCmyk[2]);

imshow("CMYK_K",vecCmyk[3]);

imshow("HSI_H",vecHsi[0]);

imshow("HSI_S",vecHsi[1]);

imshow("HSI_I",vecHsi[2]);

imshow("RGB_Image",img);

imshow("CMYK_Image",img_cmyk);

//imshow("HSV_Image",img_hsv);

//imshow("HLS_Image",img_hls);

imshow("HSI_Image",img_hsi);

waitKey();

return 0;

}

opencv raw转rgb_使用OpenCV实现RGB、HSI、CMYK颜色空间的转换相关推荐

  1. opencv raw转rgb_利用opencv将raw转换为rgb

    最近工作中碰到将.raw格式文件转换为彩图格式文件.待转换的.raw格式文件不带有图像的宽高等信息,只有图像像素值信息,利用opencv接口无法直接读取.网上查的方法都无法满足我的需求,经过各种尝试终 ...

  2. 颜色空间系列2: RGB和CIELAB颜色空间的转换及优化算法

    颜色空间系列代码下载链接:http://files.cnblogs.com/Imageshop/ImageInfo.rar (同文章同步更新) 在几个常用的颜色空间中,LAB颜色空间是除了RGB外,最 ...

  3. RGB和YCbCr颜色空间的转换及优化算法

    RGB和YCbCr颜色空间转换和优化 转载于颜色空间系列3: RGB和YCbCr颜色空间的转换及优化算法 在常用的几种颜色空间中,YCbCr颜色空间在学术论文中出现的频率是相当高的,常用于肤色检测等等 ...

  4. RGB与Lab颜色空间互相转换

    RGB与Lab颜色空间互相转换 1.Lab颜色空间 同RGB颜色空间相比(见博客<光与色的故事--颜色空间浅析>),Lab是一种不常用的色彩空间.它是在1931年国际照明委员会(CIE)制 ...

  5. RGB与Lab颜色空间互相转换 持续更新中

    RGB与Lab颜色空间互相转换 1.Lab颜色空间 同RGB颜色空间相比(见博客<光与色的故事–颜色空间浅析>),Lab是一种不常用的色彩空间.它是在1931年国际照明委员会(CIE)制定 ...

  6. 基于matlab的RGB到YCbCr颜色空间的转换

    在matlab中,图像处理工具箱会将彩色图像当做RGB图像或者索引图像来处理.除了这两种颜色空间外还有其他一些以RGB模型为基础的颜色空间,如常见的YCbCr.HSV.HSI颜色空间等.这里只讲图像从 ...

  7. 使用OpenCV实现RGB、HSI、CMYK颜色空间的转换

    RGB to HSI.CMYK的代码实现 前言: 在之前博文的基础上,我使用OpenCV2实现了RGB颜色空间向HIS.CMYK转换的代码.下列链接为各种经典颜色空间的介绍及转换公式的介绍. http ...

  8. RGB与YCbCr颜色空间的转换

    YCbCr是YUV经过缩放和偏移的翻版,可以看做YUV的子集.主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视.与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立 ...

  9. OpenCV 颜色空间RGB 到HSI CMYK的转换 C++

    从RGB 到 HSI 的空间转换 给定一幅RGB彩色格式的图像,每个RGB像素的H分量可用下式得到: 其中 等于 饱和度分量由下式给出: 强度分量下式得出: 上式已假定RGB归一化到[0-1],且角度 ...

  10. python opencv bgr转rgb_RGB最新:opencv-python的RGB与BGR互转方式_爱安网 LoveAn.com

    关于"RGB"的最新内容 聚合阅读 这篇文章主要介绍了opencv-python的RGB与BGR互转方式,具有很好的参考价值,希望对大家有所 帮助.一起跟随小编过来看看吧... 这 ...

最新文章

  1. Gartner:大数据和BI商业智能的差别和影响
  2. 有了这些经典书籍+配套实验环境上线,还有什么借口说学不好编程?
  3. mysql中nvl_Mysql中类似于oracle中nvl()函数的ifnull()函数
  4. Android应用程序管理系列(一)——管理对象封装概述
  5. 使用静态内置类实现线程安全的单例设计模式
  6. WinForm播放视频
  7. 【设计鉴赏】精选字体设计鉴赏(三)
  8. 电动车的蓄电池与锂电池
  9. 世界各国2015-2020GDP排名
  10. vue v-modle修饰符.number .trim
  11. 【AI每日播报】棋圣聂卫平告负 Master取得第54场胜利
  12. API监控:你应该衡量什么?
  13. 加快数字化发展 建设数字中国
  14. Python 的列表推导式
  15. 2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛)整理合集
  16. input光标的移动和选中
  17. 调用后台接口返回报错前端隐藏提示_前端异常监控解决方案研究(转)
  18. 简单vsftpd安装配置和 ftp客户端操作笔记
  19. 蝙蝠侠:黑暗骑士崛起 离线版(含数据包) v1.1.1
  20. 读书笔记(随笔1)分层网络模型

热门文章

  1. freemarker的recurse示例代码
  2. 算加权成绩(MATLAB)
  3. nssa和stub_OSPF里几个特殊区域(stub、Totally stubby、NSSA、Totally NSSA)总结
  4. Raid5数据恢复原理以及raid5数据恢复成功案例
  5. 时钟和数据恢复(CDR)电路原理——基于PLL
  6. 记录mysql in和not in 效率低下的问题
  7. 亲民地理-第39期-佛山(2)南风古灶_我是亲民_新浪博客
  8. MySQL数据库中多表联合查询
  9. 编程c语言经验,C语言编程学习经验3篇
  10. koa2异常处理_【HAVENT原创】KOA2 异常处理