數字圖像處理——RGB與HSI的相互轉換
> 一、RGB->HSI
clc,clear;
%圖像讀取及預處理
Image= double(imread('2.jpg'));
IMAGE1= Image(:,:,1);
[lines,samples,bands] = size(Image);
IMG1 = reshape(IMAGE1,1,[]);
MAX = max(IMG1);
MIN = min(IMG1);
HSI = zeros(lines,samples,3); %用三維向量分別存儲HSI(色度,飽和度,亮度)
for i = 1:lines
for j = 1:samples
if( Image(i,j,1)== Image(i,j,2) && Image(i,j,2) ==Image(i,j,3))
JD = 0;
else
JD = 180*acos((2*Image(i,j,1)-Image(i,j,2)-Image(i,j,3))/(2*((Image(i,j,1)-Image(i,j,2))^2+(Image(i,j,1)-Image(i,j,3))*(Image(i,j,2)-Image(i,j,3)))^0.5))/pi;
end
if(Image(i,j,2)>=Image(i,j,3))
HSI(i,j,1) = JD;
else
HSI(i,j,1) = 360 - JD;
end
HSI(i,j,2) = 1-3*min(min(Image(i,j,1),Image(i,j,2)),Image(i,j,3))/(Image(i,j,1)+Image(i,j,2)+Image(i,j,3));
HSI(i,j,3) = (Image(i,j,1)+Image(i,j,2)+Image(i,j,3))/3;
end
end
> 二、HSI->RGB
Image1 = zeros(lines,samples,3);
for i = 1:lines
for j = 1:samples
if(HSI(i,j,1)>=0 && HSI(i,j,1)<120)
Image1(i,j,3) = round(HSI(i,j,3)*(1-HSI(i,j,2)));
Image1(i,j,1) = round(HSI(i,j,3)*(1+HSI(i,j,2)*cos(pi*HSI(i,j,1)/180)/cos(pi*(60-HSI(i,j,1))/180)));
Image1(i,j,2) = round(3*HSI(i,j,3)- Image1(i,j,1)-Image1(i,j,3));
end
if(HSI(i,j,1)>=120 && HSI(i,j,1)<240)
Image1(i,j,1) = round(HSI(i,j,3)*(1-HSI(i,j,2)));
Image1(i,j,2) = round(HSI(i,j,3)*(1+HSI(i,j,2)*cos(pi*(HSI(i,j,1)-120)/180)/cos(pi*(180-HSI(i,j,1))/180)));
Image1(i,j,3) = round(3*HSI(i,j,3)- Image1(i,j,1)- Image1(i,j,2));
end
if(HSI(i,j,1)>=240 && HSI(i,j,1)<360)
Image1(i,j,2) = round(HSI(i,j,3)*(1-HSI(i,j,2)));
Image1(i,j,3) = round(HSI(i,j,3)*(1+HSI(i,j,2)*cos(pi*(HSI(i,j,1)-240)/180)/cos(pi*(360-HSI(i,j,1))/180)));
Image1(i,j,1) = round(3*HSI(i,j,3)- Image1(i,j,2)- Image1(i,j,3));
end
end
end