MATLAB GUI设计 图像处理基本操作(五)

一、图像频域处理

主要讲解在图像增强中的频域滤波。用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;

MATLAB GUI设计 图像处理基本操作(五)_第1张图片

若给定一个低通滤波器的传递函数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;

MATLAB GUI设计 图像处理基本操作(五)_第2张图片

 

你可能感兴趣的:(matlab,图像处理)