彩色补偿
彩色补偿的作用就是通过不同的颜色通道提取不同的目标物,网上的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);