图片颜色空间转换
2013-07-26 16:25
204 查看
常用的包括RGB<=>GRAY RGB=>HSV RGB<=>YCrCb RGB=>Lab RGB<=>XYZ RGB=>HLS Bayer=>RGB
不考虑读像素点问题
1、RGB=>GRAY
//RGB=>GRAY
//opencv读取每个像素点的RGB,进行转换
IplImage *img;
img=cvLoadImage("D:\\baboon.jpg",1);
cvNamedWindow("show",1);
cvShowImage("show",img);
//RGB=>GRAY
IplImage *gray;
gray=cvCreateImage(cvGetSize(img),8,1);
for(int i=0;i<img->width;i++)
{
for (int j=0;j<img->height;j++)
{
int R,G,B;
B=((uchar *)img->imageData+i*img->widthStep)[j*3+0];
G=((uchar *)img->imageData+i*img->widthStep)[j*3+1];
R=((uchar *)img->imageData+i*img->widthStep)[j*3+2];
int Y;
Y=0.212671*R + 0.715160*G + 0.072169*B ;
((uchar *)gray->imageData+i*gray->widthStep)[j]=Y;
}
}
cvNamedWindow("gray",1);
cvShowImage("gray",gray);
cvWaitKey(0);
--------------------
matlab实现:
close all;
i=imread('e:\\baboon.bmp');
%RGB到GRAY
r=i(:,:,1);
g=i(:,:,2);
b=i(:,:,3);
gray=0.212671*r+ 0.715160*g + 0.072169*b;
figure(1);
subplot(1,2,1);imshow(i);
subplot(1,2,2);imshow(gray);
2、RGB=>HSV
for(int i=0;i<img->width;i++)
{
for(int j=0;j<img->height;j++)
{
double R,G,B,Y;
B=((uchar *)(img->imageData + i * img->widthStep ))[j * img->nChannels + 0];
G=((uchar *)(img->imageData + i * img->widthStep ))[j * img->nChannels + 1];
R=((uchar *)(img->imageData + i * img->widthStep ))[j * img->nChannels + 2];
double Max;Max=(((B>G)?B:G)>R)?((B>G)?B:G):R;
double Min;Min=(((B<G)?B:G)<R)?((B<G)?B:G):R;
if(Max==Min)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=0;
else if(Max==R && G>=B)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=60*(G-B)/(Max-Min);
else if(Max==R &&G<B)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=60*(G-B)/(Max-Min)+360;
else if(Max==G)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=60*(B-R)/(Max-Min)+120;
else if(Max==B)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=60*(R-B)/(Max-Min)+240;
if(Max==0)
((uchar *)(s->imageData + i * s->widthStep ))[j ]=0;
else
((uchar *)(s->imageData + i * s->widthStep ))[j ]=1-Min/Max;
((uchar *)(v->imageData + i *v->widthStep ))[j ]=Max;
}
}
-----------
matlab实现
close all;
img=imread('e:\\baboon.bmp');
%[m n]=size(img);%如果不写维数,当读入3通道时宽度变3倍
[m n dim]=size(img);
%图像的rgb
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);
%rgb2hsv
h=zeros(m,n);
s=zeros(m,n);
v=zeros(m,n);
for i=1:m
for j=1:n
r=double(R(i,j))/255;
g=double(G(i,j))/255;
b=double(B(i,j))/255;
Max=max([r,g,b]);
Min=min([r,g,b]);
if Max==Min
h(i,j)=0;
elseif Max==r && g>=b
h(i,j)=60*(g-b)/(Max-Min)+0;
elseif Max==r && g<b
h(i,j)=60*(g-b)/(Max-Min)+360;
elseif Max==g
h(i,j)=60*(b-r)/(Max-Min)+120;
elseif Max==b
h(i,j)=60*(r-g)/(Max-Min)+240;
end
if Max==0
s(i,j)=0;
else
s(i,j)=1-Min/Max;
end
v(i,j)=Max;
end
end
figure(1);
subplot(2,2,1);imshow(img);
subplot(2,2,2);imshow(h);
subplot(2,2,3);imshow(s);
subplot(2,2,4);imshow(v);
不考虑读像素点问题
1、RGB=>GRAY
//RGB=>GRAY
//opencv读取每个像素点的RGB,进行转换
IplImage *img;
img=cvLoadImage("D:\\baboon.jpg",1);
cvNamedWindow("show",1);
cvShowImage("show",img);
//RGB=>GRAY
IplImage *gray;
gray=cvCreateImage(cvGetSize(img),8,1);
for(int i=0;i<img->width;i++)
{
for (int j=0;j<img->height;j++)
{
int R,G,B;
B=((uchar *)img->imageData+i*img->widthStep)[j*3+0];
G=((uchar *)img->imageData+i*img->widthStep)[j*3+1];
R=((uchar *)img->imageData+i*img->widthStep)[j*3+2];
int Y;
Y=0.212671*R + 0.715160*G + 0.072169*B ;
((uchar *)gray->imageData+i*gray->widthStep)[j]=Y;
}
}
cvNamedWindow("gray",1);
cvShowImage("gray",gray);
cvWaitKey(0);
--------------------
matlab实现:
close all;
i=imread('e:\\baboon.bmp');
%RGB到GRAY
r=i(:,:,1);
g=i(:,:,2);
b=i(:,:,3);
gray=0.212671*r+ 0.715160*g + 0.072169*b;
figure(1);
subplot(1,2,1);imshow(i);
subplot(1,2,2);imshow(gray);
2、RGB=>HSV
for(int i=0;i<img->width;i++)
{
for(int j=0;j<img->height;j++)
{
double R,G,B,Y;
B=((uchar *)(img->imageData + i * img->widthStep ))[j * img->nChannels + 0];
G=((uchar *)(img->imageData + i * img->widthStep ))[j * img->nChannels + 1];
R=((uchar *)(img->imageData + i * img->widthStep ))[j * img->nChannels + 2];
double Max;Max=(((B>G)?B:G)>R)?((B>G)?B:G):R;
double Min;Min=(((B<G)?B:G)<R)?((B<G)?B:G):R;
if(Max==Min)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=0;
else if(Max==R && G>=B)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=60*(G-B)/(Max-Min);
else if(Max==R &&G<B)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=60*(G-B)/(Max-Min)+360;
else if(Max==G)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=60*(B-R)/(Max-Min)+120;
else if(Max==B)
((uchar *)(h->imageData + i * h->widthStep ))[j ]=60*(R-B)/(Max-Min)+240;
if(Max==0)
((uchar *)(s->imageData + i * s->widthStep ))[j ]=0;
else
((uchar *)(s->imageData + i * s->widthStep ))[j ]=1-Min/Max;
((uchar *)(v->imageData + i *v->widthStep ))[j ]=Max;
}
}
-----------
matlab实现
close all;
img=imread('e:\\baboon.bmp');
%[m n]=size(img);%如果不写维数,当读入3通道时宽度变3倍
[m n dim]=size(img);
%图像的rgb
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);
%rgb2hsv
h=zeros(m,n);
s=zeros(m,n);
v=zeros(m,n);
for i=1:m
for j=1:n
r=double(R(i,j))/255;
g=double(G(i,j))/255;
b=double(B(i,j))/255;
Max=max([r,g,b]);
Min=min([r,g,b]);
if Max==Min
h(i,j)=0;
elseif Max==r && g>=b
h(i,j)=60*(g-b)/(Max-Min)+0;
elseif Max==r && g<b
h(i,j)=60*(g-b)/(Max-Min)+360;
elseif Max==g
h(i,j)=60*(b-r)/(Max-Min)+120;
elseif Max==b
h(i,j)=60*(r-g)/(Max-Min)+240;
end
if Max==0
s(i,j)=0;
else
s(i,j)=1-Min/Max;
end
v(i,j)=Max;
end
end
figure(1);
subplot(2,2,1);imshow(img);
subplot(2,2,2);imshow(h);
subplot(2,2,3);imshow(s);
subplot(2,2,4);imshow(v);
相关文章推荐
- CSDN-markdown语法——缩进、图片居中、字体、字号与颜色
- 在 Laravel 5.1 中使用 Intervention Image 包将图片颜色变灰
- opencv RGB 颜色 灰色图片显示
- 设置对话框的背景颜色或者图片
- RGBA颜色制作图片特效
- js抓取图片颜色
- PHP获取图片颜色值,检测图片主要颜色的代码:
- OpenCV改变验证码图片颜色
- iOS中将颜色转为图片
- UITabBarController设置选中时图片和文字的颜色
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- html基础 <body> 背景颜色 bgColor 背景图片(平铺) background
- 颜色与图片存储原理(摘自网上资料)
- android 之修改图片的某一颜色值
- 解决NavigationView Item图标不能显示图片原始颜色的问题
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- ps 换图片的背景颜色
- iOS用图片设置背景颜色colorWithPatternImage
- Flash图片处理—颜色变换
- 南丁格尔玫瑰图-修改扇形块的颜色与玫瑰图添加图片与文字