数字图像处理 | GUI 的制作

一.实验要求

三个函数已经写好,要求完成如下功能:

二.操作步骤

1.在命令行>>guide

2.承载图片的窗口是

其他的组件,如单选,pushButton也在这里

 

★3.写回调函数,大部分是自动生成的,我们不用管.只关注自己创建的组件.

①"打开图像"按钮

axes(handles.axes1);                                    %锁定到特定组件,这个handles.xxx由 组件的Tag来决定
[filename,pathname]=uigetfile({'*.bmp;*.jpg;*.png;*.jpeg;*.tif'},'选择图片');
str=[pathname filename];
im = imread(str);
imshow(im);

 

②单选按钮 .    让对应的全局变量置1

如1号选项:

set(handles.radiobutton1,'value',1);
set(handles.radiobutton2,'value',0);
set(handles.radiobutton3,'value',0);

2号选项:

set(handles.radiobutton1,'value',0);
set(handles.radiobutton2,'value',1);
set(handles.radiobutton3,'value',0); 

3号选项

set(handles.radiobutton1,'value',0);
set(handles.radiobutton2,'value',0);
set(handles.radiobutton3,'value',1); 

 

③"复原"按钮        根据3个全局变量的值,选择调用哪一个函数

%复原函数
axes(handles.axes2);                                     %锁定到axes2这个图片窗口上
I=getimage(handles.axes1);
if get(handles.radiobutton1,'value')                 %以这种方式分辨选择的图片
   Defog(I);
elseif get(handles.radiobutton2,'value')
   Deniose(I);
elseif get(handles.radiobutton3,'value')
    Deblur(I);
end

 

被调用的三个函数写在GUI.m里,因为函数写在同文件夹的其他.m文件里会报错

function  Out=Deniose(Src)
%   Src:输入图像
%   Out:输出结果


%% 以下是增强亮度
Src=Src+50;

%% 以下是增强对比度
M=stretchlim(Src);
Src=imadjust(Src,M,[0 1]);

%% 以下是巴特沃斯高通通滤波降噪
r1=Src(:,:,1);
r2=Src(:,:,2);
r3=Src(:,:,3);

[M,N]=size(r1);      %尺寸,仅保留一个即可
M=M*2;N=N*2;

F1=fft2(r1,M,N);              %获得频谱图像(复数),尺寸有填充
F1=fftshift(F1);             %频谱图像中心化
F2=fft2(r2,M,N);              %获得频谱图像(复数),尺寸有填充
F2=fftshift(F2);             %频谱图像中心化
F3=fft2(r3,M,N);              %获得频谱图像(复数),尺寸有填充
F3=fftshift(F3);             %频谱图像中心化

H=zeros(M,N);               %保留一个即可
G=zeros(M,N);
n=2;

for i=1:M
    for j=1:N
        D=sqrt((i-fix(M/2))^2+(j-fix(N/2))^2);             %fix()朝0方向取整数
        H(i,j)=1/(1+(250/D)^(2*n));                            %与低通区别在于D0/D
    end
end

G1=F1.*H;
G1=ifftshift(G1);              %再一次中心化
g1=real(ifft2(G1));           %反频谱化,取实数部分
g1=g1(1:M/2,1:N/2);           %剪切左上角

G2=F2.*H;
G2=ifftshift(G2);              %再一次中心化
g2=real(ifft2(G2));           %反频谱化,取实数部分
g2=g2(1:M/2,1:N/2);           %剪切左上角

G3=F3.*H;
G3=ifftshift(G3);              %再一次中心化
g3=real(ifft2(G3));           %反频谱化,取实数部分
g3=g3(1:M/2,1:N/2);           %剪切左上角

outputArg1=r1+uint8(g1);
outputArg2=r2+uint8(g2);
outputArg3=r3+uint8(g3);

Out=cat(3,outputArg1,outputArg2,outputArg3);

imshow(Out);

function J=Defog(I)
% I: 输入的雾霾图像
% J:输出去雾图像

%% 取3通道
I_r = double(I(:,:,1));
I_g = double(I(:,:,2));
I_b = double(I(:,:,3));

%% 分别取log
I_r_log = log(I_r+1);
I_g_log = log(I_g+1);
I_b_log = log(I_b+1);

%% 不同sigma值的算子
[m,n] = size(I_r);
sigma1 = 15;
sigma2 = 80;
sigma3 = 200;
f1 = fspecial('gaussian', [m, n], sigma1);
f2 = fspecial('gaussian', [m, n], sigma2);
f3 = fspecial('gaussian', [m, n], sigma3);
efft1 = fft2(double(f1));
efft2 = fft2(double(f2));
efft3 = fft2(double(f3));

%% 傅里叶变换
Rfft1 = fft2(I_r);
Gfft1 = fft2(I_g);
Bfft1 = fft2(I_b);

%% 加权1
D_r1 = ifft2(Rfft1.*efft1);
D_g1 = ifft2(Gfft1.*efft1);
D_b1 = ifft2(Bfft1.*efft1);
D_r_log1 = log(D_r1 + 1);
D_g_log1 = log(D_g1 + 1);
D_b_log1 = log(D_b1 + 1);
R1 = I_r_log - D_r_log1;
G1 = I_g_log - D_g_log1;
B1 = I_b_log - D_b_log1;

%% 加权2
D_r2 = ifft2(Rfft1.*efft2);
D_g2 = ifft2(Gfft1.*efft2);
D_b2 = ifft2(Bfft1.*efft2);
D_r_log2 = log(D_r2 + 1);
D_g_log2 = log(D_g2 + 1);
D_b_log2 = log(D_b2 + 1);
R2 = I_r_log - D_r_log2;
G2 = I_g_log - D_g_log2;
B2 = I_b_log - D_b_log2;

%% 加权3
D_r3 = ifft2(Rfft1.*efft3);
D_g3 = ifft2(Gfft1.*efft3);
D_b3 = ifft2(Bfft1.*efft3);
D_r_log3 = log(D_r3 + 1);
D_g_log3 = log(D_g3 + 1);
D_b_log3 = log(D_b3 + 1);
R3 = I_r_log - D_r_log3;
G3 = I_g_log - D_g_log3;
B3 = I_b_log - D_b_log3;

%% 开始加权
R = 0.3*R1 + 0.4*R2 + 0.3*R3;
G = 0.3*G1 + 0.4*G2 + 0.3*G3;
B = 0.3*B1 + 0.4*B2 + 0.3*B3;

R = exp(R);
MIN = min(min(R)); 
MAX = max(max(R));
R = (R - MIN)/(MAX - MIN);
R = adapthisteq(R);

G = exp(G);
MIN = min(min(G)); 
MAX = max(max(G));
G = (G - MIN)/(MAX - MIN);
G = adapthisteq(G);

B = exp(B);
MIN = min(min(B)); 
MAX = max(max(B));
B = (B - MIN)/(MAX - MIN);
B = adapthisteq(B);

%% 三合一
J = cat(3, R, G, B);
imshow(J);

function J=Deblur(I)
%   Src:输入图像
%   Out:输出结果

PSF=fspecial('motion',6,-8);

noise_var = 10;
IR = deconvwnr(I, PSF, noise_var);

M=stretchlim(IR);
I=imadjust(IR,M,[0 1]);

J=I+30;
imshow(J);

别忘了最后的imshow() 

 

 

四.运行结果

 

①初始界面

 

 

②去雾操作

③低照度降噪和增强

④去模糊

 

 

posted @ 2020-06-09 00:16  心碎人俱乐部  阅读(36)  评论(0)    收藏  举报