彩色补偿通过不同通道提取不同目标物。彩色平衡将三基色平衡
function hsi = rgb2hsi(rgb) % hsi = rgb2hsi(rgb)把一幅RGB图像转换为HSI图像, % 输入图像是一个彩色像素的M×N×3的数组, % 其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。 % 假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。 % 输入图像可能是double(取值范围是[0, 1]),uint8或 uint16。 % % 输出HSI图像是double, % 其中hsi(:, :, 1)是色度分量,它的范围是除以2*pi后的[0, 1]; % hsi(:, :, 2)是饱和度分量,范围是[0, 1]; % hsi(:, :, 3)是亮度分量,范围是[0, 1]。 % 抽取图像分量 rgb = im2double(rgb); r = rgb(:, :, 1); g = rgb(:, :, 2); b = rgb(:, :, 3); % 执行转换方程 num = 0.5*((r - g) + (r - b)); den = sqrt((r - g).^2 + (r - b).*(g - b)); theta = acos(num./(den + eps)); %防止除数为0 H = theta; H(b > g) = 2*pi - H(b > g); H = H/(2*pi); num = min(min(r, g), b); den = r + g + b; den(den == 0) = eps; %防止除数为0 S = 1 - 3.* num./den; H(S == 0) = 0; I = (r + g + b)/3; % 将3个分量联合成为一个HSI图像 hsi = cat(3, H, S, I);
function rgb = hsi2rgb(hsi) % rgb = hsi2rgb(hsi)把一幅HSI图像转换为RGB图像, % 其中hsi(:, :, 1)是色度分量,它的范围是除以2*pi后的[0, 1]; % hsi(:, :, 2)是饱和度分量,范围是[0, 1]; % hsi(:, :, 3)是亮度分量,范围是[0, 1]。 % % 输出图像分量: % rgb(:, :, 1)为红; % rgb(:, :, 2)为绿; % rgb(:, :, 3)为蓝。 % 抽取图像分量 hsi = im2double(hsi); H = hsi(:, :, 1) * 2 * pi; S = hsi(:, :, 2); I = hsi(:, :, 3); % 执行转换方程 R = zeros(size(hsi, 1), size(hsi, 2)); G = zeros(size(hsi, 1), size(hsi, 2)); B = zeros(size(hsi, 1), size(hsi, 2)); % RG扇形(0 <= H < 2*pi/3) idx = find( (0 <= H) & (H < 2*pi/3)); B(idx) = I(idx) .* (1 - S(idx)); R(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx)) ./ ... cos(pi/3 - H(idx))); G(idx) = 3*I(idx) - (R(idx) + B(idx)); % BG扇形(2*pi/3 <= H < 4*pi/3) idx = find( (2*pi/3 <= H) & (H < 4*pi/3) ); R(idx) = I(idx) .* (1 - S(idx)); G(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 2*pi/3) ./ ... cos(pi - H(idx))); B(idx) = 3*I(idx) - (R(idx) + G(idx)); % BR扇形 idx = find( (4*pi/3 <= H) & (H <= 2*pi)); G(idx) = I(idx) .* (1 - S(idx)); B(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 4*pi/3) ./ ... cos(5*pi/3 - H(idx))); R(idx) = 3*I(idx) - (G(idx) + B(idx)); % 将3个分量联合成为一个RGB图像 rgb = cat(3, R, G, B); rgb = max(min(rgb, 1), 0);
function yuv = rgb2yuv(rgb) % yuv = rgb2yuv(rgb)把一幅RGB图像转换为YUV图像, % 输入图像是一个彩色像素的M×N×3的数组, % 其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。 % 假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。 % 输入图像可能是double(取值范围是[0, 1]),uint8或 uint16。 % % 输出YUV图像是uint8。 rgb = im2double(rgb); r = rgb(:, :, 1); g = rgb(:, :, 2); b = rgb(:, :, 3); % 执行转换函数 y = 0.299*r + 0.587*g + 0.114*b; u = 0.567*(b - y); v = 0.713*(r - y); % 防止溢出 if(y < 0) y = 0; end; if(y > 1.0) y = 1.0; end; if(u < 0) u = 0; end; if(u > 1.0) u = 1.0; end; if(v < 0) v = 0; end; if(v > 1.0) v = 1.0; end; % 联合yuv,并转成uint8类型 y = y*255; u = u*255; v = v*255; yuv = cat(3, y, u, v); yuv = uint8(yuv);
function rgb = yuv2rgb(yuv) % yuv = rgb2yuv(rgb)把一幅RGB图像转换为YUV图像, % 输入图像是一个彩色像素的M×N×3的数组, % 其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。 % 假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。 % 输入图像可能是double(取值范围是[0, 1]),uint8或 uint16。 % % 输出YUV图像是uint8。 yuv = im2double(yuv); y = yuv(:, :, 1); u = yuv(:, :, 2); v = yuv(:, :, 3); % 执行转换函数 r = y + 1.402*v; g = y - 0.344*u - 0.714*v; b = y + 1.772*u; % 防止溢出 if(r < 0) r = 0; end; if(r > 1.0) r = 1.0; end; if(g < 0) g = 0; end; if(g > 1.0) g = 1.0; end; if(b < 0) b = 0; end; if(b > 1.0) b = 1.0; end; % 联合rgb r = r*255; g = g*255; b = b*255; rgb = cat(3, r, g, b); rgb = uint8(rgb);
% compensate.m % 彩色补偿 im=double(imread('plane.bmp')); subplot(1,2,1); imshow(uint8(im)); title('原始图'); [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); subplot(1,2,2); imshow(S); title('补偿后');
% balance.m % 彩色平衡 im=double(imread('plane.bmp')); [m,n,p]=size(im); F1=im(1,1,:); F2=im(1,2,:); F1_(1,1,1)=F1(:,:,2); F1_(1,1,2)=F1(:,:,2); F1_(1,1,3)=F1(:,:,2); F2_(1,1,1)=F2(:,:,2); F2_(1,1,2)=F2(:,:,2); F2_(1,1,3)=F2(:,:,2); K1=(F1_(1,1,1)-F2_(1,1,1))/(F1(1,1,1)-F2(1,1,1)); K2=F1_(1,1,1)-K1*F1(1,1,1); L1=(F1_(1,1,3)-F2_(1,1,3))/(F1(1,1,3)-F2(1,1,3)); L2=F1_(1,1,3)-L1*F1(1,1,3); for i=1:m for j=1:n new(i,j,1)=K1*im(i,j,1)+K2; new(i,j,2)=im(i,j,2); new(i,j,3)=L1*im(i,j,3)+L2; end end im=uint8(im); new=uint8(new); subplot(1,2,1); imshow(im); title('原始图'); subplot(1,2,2); imshow(new); title('平衡后');