RGB转HSI
function hsi=rgb2hsi(rgb)
% rgb转hsi
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);
theta=acos(0.5*((r-g)+(r-b))./(((r-g).^2+(r-b).*(g-b)).^0.5+eps));
hsi(:,:,1)=(theta.*(b<g+(b==g))+(2*pi-theta).*(b>g))/(2*pi);
hsi(:,:,2)=1-3*(min(min(r,g),b))./(r+g+b+eps);
hsi(:,:,3)=(r+g+b)/3;
HSI转RGB
function rgb=hsi2rgb(hsi)
% hsi转rgb
h=hsi(:,:,1);
s=hsi(:,:,2);
i=hsi(:,:,3);
[m,n,~]=size(hsi);
r=zeros(m,n);
g=zeros(m,n);
b=zeros(m,n);
h=h*2*pi;
hr=(((h>0)+(h==0)).*(h<(2*pi/3)))>0;
hg=(((h>(2*pi/3))+(h==(2*pi/3))).*(h<(4*pi/3)))>0;
hb=(((h>(4*pi/3))+(h==(4*pi/3))).*(h<(2*pi)))>0;
h(hg)=h(hg)-(2*pi/3);
h(hb)=h(hb)-(4*pi/3);
b(hr)=i(hr).*(1-s(hr));
r(hr)=i(hr).*(1+(s(hr).*cos(h(hr))./(cos(pi/3-h(hr))+eps)));
g(hr)=3*i(hr)-(r(hr)+b(hr));
r(hg)=i(hg).*(1-s(hg));
g(hg)=i(hg).*(1+(s(hg).*cos(h(hg))./(cos(pi/3-h(hg))+eps)));
b(hg)=3*i(hg)-(r(hg)+g(hg));
g(hb)=i(hb).*(1-s(hb));
b(hb)=i(hb).*(1+(s(hb).*cos(h(hb))./(cos(pi/3-h(hb))+eps)));
r(hb)=3*i(hb)-(g(hb)+b(hb));
rgb=cat(3,r,g,b);
rgb=uint8(rgb*255);
均值滤波
% 均值滤波
function out=meanfilter(ksize,in)
% 参数分别指定kernel size和原始图像
[h,w,d]=size(in);
if d==1
im=in;
padim=padarray(im,[floor(ksize/2),floor(ksize/2)],'symmetric','both');
for i=1:h
for j=1:w
temp=double(padim(i:i+ksize-1,j:j+ksize-1));
out(i,j)=mean(mean(temp));
end
end
else
for k=1:d
im=in(:,:,k);
padim=padarray(im,[floor(ksize/2),floor(ksize/2)],0,'both');
for i=1:h
for j=1:w
temp=double(padim(i:i+ksize-1,j:j+ksize-1));
out(i,j,k)=mean(mean(temp));
end
end
end
end
end
效果演示
原图
转HSI
在H域做均值滤波
转回RGB