数字图像处理 | 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
endG1=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()
四.运行结果
①初始界面

②去雾操作


③低照度降噪和增强


④去模糊



浙公网安备 33010602011771号