(7)MATLAB彩色图像处理

  • Post author:
  • Post category:其他


彩色补偿通过不同通道提取不同目标物。彩色平衡将三基色平衡
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('平衡后');