图片颜色空间转换

常用的包括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);  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值