(7)MATLAB彩色图像处理

来源:互联网 发布:跑跑辅助源码猴岛 编辑:程序博客网 时间:2024/06/12 01:44
彩色补偿通过不同通道提取不同目标物。彩色平衡将三基色平衡
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)); %防止除数为0H = 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; %防止除数为0S = 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;    % 联合rgbr = 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);    endendS=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;    endendim=uint8(im);new=uint8(new);subplot(1,2,1);imshow(im);title('原始图');subplot(1,2,2);imshow(new);title('平衡后');





原创粉丝点击