一、图像频域处理
主要讲解在图像增强中的频域滤波。用f(x,y)表示一幅M*N的图像,进行DFT二维离散傅里叶变换后表示为F(u,v),其关于原点共轭对称频谱也关于原点对称,且DFT在u和v方向上都是周期无穷的,傅里叶逆变换得到的图像也是周期无穷的,根据其共轭性质和周期性可以推出,图像的幅度谱能量集中在原点,通过fft2函数可求得图像的快速傅里叶变换,通过fftshift函数可将图像的原点移动到中间,更好的观察其周期性。以下为求图像幅度谱的代码:
global s;
axes(handles.axes2);
a=imread(s);
if ndims(a)==3
a=rgb2gray(a);
end
b=fft2(double(a));%傅里叶变换
fc=fftshift(b);%图像中心移到中间
f=log(1+abs(fc));
imshow(f,[]);
setappdata(handles.axes2,'img2',f);
global cell;
global pos;
imgpro=getappdata(handles.axes2,'img2');
pos=pos+1;
cell{pos}=imgpro;
若给定一个低通滤波器的传递函数Hlp(u,v),则相应高通滤波器的传递函数为Hhp(u,v)=1-Hlp(u,v) ,对此我展示理想高低通、高斯高低通、巴特沃斯高低通滤波器。
%理想低通
global s;
axes(handles.axes2);
a=imread(s);
if ndims(a)==3
a=rgb2gray(a);
end
b=fft2(double(a));%傅里叶变换
fc=fftshift(b);%图像中心移到中间
f=log(1+abs(fc));%取模缩放
[m,n]=size(fc);
m0=round(m/2);%四舍五入
n0=round(n/2);
d=15;
for i=1:m
for j=1:n
distance=sqrt((i-m0)^2+(j-n0)^2);
if distance<=d
h=1;
else
h=0;
end
fc(i,j)=h*fc(i,j);
end
end
fc=uint8(real(ifft2(ifftshift(fc))));%原点位置重置
imshow(fc);
setappdata(handles.axes2,'img2',fc);
global cell;
global pos;
imgpro=getappdata(handles.axes2,'img2');
pos=pos+1;
cell{pos}=imgpro;
%巴特沃斯低通
global s;
axes(handles.axes2);
a=imread(s);
if ndims(a)==3
a=rgb2gray(a);
end
a=double(a);
[m,n]=size(a);
pq=2*a;%填零扩充
fq=fft2(a,pq(1),pq(2));%扩充后傅里叶变换
fq=fftshift(fq);
m0=round(pq(1)/2);%四舍五入
n0=round(pq(2)/2);
n1=2;%阶次
w1=80;%截止频率
for i=1:pq(1)
for j=1:pq(2)
d=sqrt((i-m0)^2+(j-n0)^2);
h=1/(1+0.414*(d/w1)^(2*n1));%传递函数
fq(i,j)=h*fq(i,j);
end
end
fq=uint8(real(ifft2(ifftshift(fq))));%原点位置重置,反变换
F=fq(1:m,1:n);
imshow(F);
setappdata(handles.axes2,'img2',F);
global cell;
global pos;
imgpro=getappdata(handles.axes2,'img2');
pos=pos+1;
cell{pos}=imgpro;
%高斯低通
global s;
axes(handles.axes2);
a=imread(s);
if ndims(a)==3
a=rgb2gray(a);
end
a=double(a);
d0=30;
[m,n]=size(a);
img=fft2(a);
img=fftshift(img);
m0=round(m/2);%四舍五入
n0=round(n/2);
h=zeros(m,n);
for i=1:m
for j=1:n
d=((i-m0)^2+(j-n0)^2);
h(i,j)=exp(-(d)/(2*(d0^2)));
end
end
img1=h.*img;
img1=uint8(real(ifft2(ifftshift(img1))));%原点位置重置
imshow(img1);
setappdata(handles.axes2,'img2',img1);
global cell;
global pos;
imgpro=getappdata(handles.axes2,'img2');
pos=pos+1;
cell{pos}=imgpro;
二、彩色图像处理
1.彩图转灰度图,自写函数
老师要求,主要分辨彩图为真彩色还是256色图,利用公式gray=r*0.299+g*0.587+b*0.114来转换,其中256色图像利用了索引图像,因此需要区别处理。
利用cat函数,可将三种rgb分量组合成衣服彩色图像:rgb_image=cat(3,r,g,b);
global s;
a=imread(s);
if ndims(a)==3 %分辨是否为真彩
r=a(:,:,1);
g=a(:,:,2);
b=a(:,:,3);
axes(handles.axes2);
gray=r*0.299+g*0.587+b*0.114;
imshow(gray);
elseif ndims(a)==2 %是否为256色
[x,map]=imread(s);
r=map(:,:,1);
g=map(:,:,2);
b=map(:,:,3);
Gray=round((r+g+b)/3);
map(:,:,1)=Gray;
map(:,:,2)=Gray;
map(:,:,3)=Gray;
axes(handles.axes2);
imshow(x,map);
end
setappdata(handles.axes2,'img2',gray);
global cell;
global pos;
imgpro=getappdata(handles.axes2,'img2');
pos=pos+1;
cell{pos}=imgpro;
2.图像标伪彩
对图像进行灰度化处理后标上自己要求的颜色并显示颜色条:
global s;
a=imread(s);
I=double(rgb2gray(a));
axes(handles.axes2);
[M,N]=size(I);
B=zeros(M,N,3);
% 归一化处理
I=(I/max(max(I))).*5;
color5=[255/255 255/255 255/255];%颜色自定义
color4=[255/255 255/255 0/255];
color3=[255/255 0/255 255/255];
color2=[0/255 255/255 0/255];
color1=[0/255 0/255 255/255];
color0=[0/255 0/255 0/255];
for i=1:M
for j=1:N
Id=floor(I(i,j));
if Id>=4
B(i,j,:,:,:)=color4;
elseif I(i,j)<=0
B(i,j,:,:,:)=[0 0 0];
else
col=I(i,j)-Id;
end
if Id<1
B(i,j,:,:,:)=color1.*col+color0.*(1-col);
elseif Id<2
B(i,j,:,:,:)=color2.*col+color1.*(1-col);
elseif Id<3
B(i,j,:,:,:)=color3.*col+color2.*(1-col);
elseif Id<4
B(i,j,:,:,:)=color4.*col+color3.*(1-col);
elseif Id<5
B(i,j,:,:,:)=color5.*col+color4.*(1-col);
end
end
end
imshow(B,[]);
colorbar('southoutside');
setappdata(handles.axes2,'img2',B);
global cell;
global pos;
imgpro=getappdata(handles.axes2,'img2');
pos=pos+1;
cell{pos}=imgpro;