您的位置:首页 > 其它

图片颜色空间转换

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: