彩色补偿的一些理解

彩色补偿

彩色补偿的作用就是通过不同的颜色通道提取不同的目标物,网上的matlab函数代码如下(注意:有个小错误)
在这里插入图片描述

function S = compensate(im)
[m,n,p]=size(im);
[h1,k1]=min(255-im(:,:,1)+im(:,:,2)+im(:,:,3));
[j1,minx]=min(h1);
i1=k1(j1);%提取图像中最接近红色的点,其在im中的坐标为i1,j1
r1=im(i1,j1,1);
g1=im(i1,j1,2);
b1=im(i1,j1,3);
R=0.30*r1+0.59*g1+0.11*b1;

[h2,k2]=min(255-im(:,:,2)+im(:,:,1)+im(:,:,3));
[j2,minx]=min(h2);
i2=k2(j2);%提取图像中最接近绿色的点,其在im中的坐标为i2,j2
r2=im(i2,j2,1);
g2=im(i2,j2,2);
b2=im(i2,j2,3);
G=0.30*r2+0.59*g2+0.11*b2;

[h3,k3]=min(255-im(:,:,3)+im(:,:,1)+im(:,:,2));
[j3,minx]=min(h3);
i3=k3(j3);%提取图像中最接近蓝色的点,其在im中的坐标为i3,j3
r3=im(i3,j3,1);
g3=im(i3,j3,2);
b3=im(i3,j3,3);
B=0.30*r3+0.59*g3+0.11*b3;

A1=[r1 r2 r3
     g1 g2 g3
     b1 b2 b3];
A2=[R 0 0
     0 G 0
     0 0 B];
C=A1*inv(A2);

for i=1:m
    for j=1:n
        imR=im(i,j,1);
        imG=im(i,j,2);
        imB=im(i,j,3);
        temp=inv(C)*[imR;imG;imB];
        S(i,j,1)=temp(1);
        S(i,j,2)=temp(2);
        S(i,j,3)=temp(3);
    end
end
S=uint8(S);
end

Matlab中[Y,U]=min(A):当A是矩阵时,返回行向量Y和U,Y向量记录A的每列的最小值,U向量记录每列最小值的行号;当A是行或列向量时,Y记录的是A中的最小值,U记录的是索引位置。
所以,上述第四行代码[j1,minx]=min(h1)中,j1为最小值,而minx为列索引,后面的同理,则应该改为:

function S = compensate(im)
[m,n,p]=size(im);
[h1,k1]=min(255-im(:,:,1)+im(:,:,2)+im(:,:,3));
[minx,j1]=min(h1);
i1=k1(j1);%提取图像中最接近红色的点,其在im中的坐标为i1,j1
r1=im(i1,j1,1);
g1=im(i1,j1,2);
b1=im(i1,j1,3);
R=0.30*r1+0.59*g1+0.11*b1;

[h2,k2]=min(255-im(:,:,2)+im(:,:,1)+im(:,:,3));
[minx,j2]=min(h2);
i2=k2(j2);%提取图像中最接近绿色的点,其在im中的坐标为i2,j2
r2=im(i2,j2,1);
g2=im(i2,j2,2);
b2=im(i2,j2,3);
G=0.30*r2+0.59*g2+0.11*b2;

[h3,k3]=min(255-im(:,:,3)+im(:,:,1)+im(:,:,2));
[minx,j3]=min(h3);
i3=k3(j3);%提取图像中最接近蓝色的点,其在im中的坐标为i3,j3
r3=im(i3,j3,1);
g3=im(i3,j3,2);
b3=im(i3,j3,3);
B=0.30*r3+0.59*g3+0.11*b3;

A1=[r1 r2 r3
     g1 g2 g3
     b1 b2 b3];
A2=[R 0 0
     0 G 0
     0 0 B];
C=A1*inv(A2);

for i=1:m
    for j=1:n
        imR=im(i,j,1);
        imG=im(i,j,2);
        imB=im(i,j,3);
        temp=inv(C)*[imR;imG;imB];
        S(i,j,1)=temp(1);
        S(i,j,2)=temp(2);
        S(i,j,3)=temp(3);
    end
end
S=uint8(S);
end

或者

[m,n,p]=size(im);
[h1,k1]=min(255-im(:,:,1)+im(:,:,2)+im(:,:,3));
[j1,minx]=min(h1);
 i1=k1(minx);%提取图像中最接近红色的点,其在im中的坐标为i1,minx
 r1=im(i1,minx,1);
 g1=im(i1,minx,2);
 b1=im(i1,minx,3);
R=0.30*r1+0.59*g1+0.11*b1;
 
[h2,k2]=min(255-im(:,:,2)+im(:,:,1)+im(:,:,3));
[j2,minx1]=min(h2);
 i2=k2(minx1);%提取图像中最接近绿色的点,其在im中的坐标为i2,minx
 r2=im(i2,minx1,1);
 g2=im(i2,minx1,2);
 b2=im(i2,minx1,3);
G=0.30*r2+0.59*g2+0.11*b2;
 
[h3,k3]=min(255-im(:,:,3)+im(:,:,1)+im(:,:,2));
[j3,minx2]=min(h3);
 i3=k3(minx2);%提取图像中最接近蓝色的点,其在im中的坐标为i3,minx
 r3=im(i3,minx2,1);
 g3=im(i3,minx2,2);
 b3=im(i3,minx2,3);
B=0.30*r3+0.59*g3+0.11*b3;
 
A1=[r1 r2 r3
    g1 g2 g3
    b1 b2 b3];
A2=[R 0 0
    0 G 0
    0 0 B];
C=A1*inv(A2);
 
for i=1:m
    for j=1:n
 
          imR=im(i,j,1);
          imG=im(i,j,2);
          imB=im(i,j,3);
          temp=inv(C)*[imR;imG;imB];
          S(i,j,1)=temp(1);
          S(i,j,2)=temp(2);
          S(i,j,3)=temp(3);
    end
end
S=uint8(S);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值