〇、写在前面
本文为一个刚入门 MATLAB 的学生所写,内容是使用 APP Designer 做一个 GUI 界面的图像处理的小工具。还有很多不足,欢迎批评指正。
APP Designer 学习教程指路👉MATLAB App Designer基础教程Matlab GUI界面设计
作业要求指路👉数字图像处理之matlab大作业:自制图像处理小工具
一、设计思路
最开始画的界面(左)和最终完成界面(右)如下图所示。
我最开始的设计是有左右切换按钮的,但后来发现只做一页更加方便也更好看,所以就改了一下。
二、功能模块
在开始敲代码之前,首先了解一下局部变量和全局变量。课程指路👉局部变量和全局变量的理解和类的解释
我在这个作业中一共定义了四个全局变量:
properties (Access = private)
Super_Image % 全局图像
Temp_Image % 临时图像
Change_Image % 添加噪声后的图像
Count_Image % 硬币计数
end
在知道什么是全局变量后,我们就可以开始一步一步来码代码啦!
1、导入图片
从您的计算机中选择图像
导入图片可以从文件夹导入图片,也可以从摄像头加载图片,我选择的是从文件夹导入图片。学习 uigetfile( ) 函数的教程指路👉错误提示框和uigetfile交互式获取文件-strcat函数拼接
我在看了教程之后,再结合了一些网上的其他内容(找不到链接了),写下了以下代码:
%从资源管理器获取图像
[filename, pathname]=uigetfile(...
{
'*.tif;*.bmp;*.png;*.jpg',...
'Image Files(*.tif,*.bmp,*.png,*.jpg)'},...
'选择图片');
if isequal(filename,0) || isequal(pathname,0)
return;
else
%记录获取文件的名字和路径
app.Super_Image = strcat(pathname,filename); %将读取到的图像赋给全局图像
app.Temp_Image = strcat(pathname,filename); %将读取到的图像赋给临时图像
end
im = imread(app.Super_Image); %读取全局图像
imshow(im,'Parent',app.Ori_Image); %将全局图像显示在原图坐标区
将以上代码添加到 “打开图像” 按钮回调函数中,可实现在文件夹获取图片的效果:
2、保存图像
将处理后的图像保存到您的计算机中
这一部分内容我是参考了网上的一些案例,能够实现将效果预览坐标区的图像保存到计算机中。
代码如下:
if ~isempty(app.Pri_Image)
[file, path] = uiputfile('*.png','命名图片并保存到您的计算机中');
save = [path file];
if ~(isequal(file, 0) || isequal(path,0))
imwrite(app.Temp_Image,save,'png');
end
else
msgbox("操作失败,预览图像为空!","错误","error");
end
3、清空面板
将坐标区以及直方图清空
使用cla函数清空坐标区,达到清空显示的效果,将全局变量图片赋值为[ ]空矩阵,达到清空图片的效果。代码如下:
cla(app.Pri_Plot);
cla(app.Ori_Plot);
cla(app.Pri_Image);
cla(app.Ori_Image);
app.Super_Image=[];
app.Temp_Image=[];
app.Change_Image=[];
app.Count_Image=[];
4、退出程序
通过对话框提示实现交互性关闭程序
使用delete函数关闭整个程序主界面实现退出的效果,close也能达到相同的效果,且效果更好,能关闭所有的窗口。代码如下:
choice = questdlg('确定要退出吗?','提示','确定','取消','取消');
switch choice
case '确定'
% delete 和 close 任选其一
delete(app.UIFigure); %退出程序
% close all; %关闭所有窗口
return;
case '取消'
return;
end
5、彩色图像灰度化
对图像进行灰度化处理,并弹窗提示是否继续进行二值化处理
获取原图像大小以及判断通道,如果只有一个通道说明为灰度图,则不需要变换;如果不止一个通道则进行变换。使用rgb2gray函数将图片转化为灰度图。在图片转化为灰度图后可使用im2bw函数将灰度图二值化。作业要求将彩色图像灰度化,灰度图像二值化,所以我在将彩色图像灰度化后加了一个弹窗,询问是否将图像二值化。
代码如下:
if isempty(app.Temp_Image)
return;
end
%读取原图
app.Temp_Image = app.Super_Image;
im = imread(app.Temp_Image);
[~,~,h] = size(im); % 获取原图像的大小
if h==1
Grayim = im; % 如果只有一个通道说明是灰度图像,不需要做变换
else
Grayim = rgb2gray(im);
end
imshow(Grayim,'Parent',app.Pri_Image);
app.Temp_Image = Grayim;
choice = questdlg('已将图像灰度化,要将图像二值化吗?','提示','确定','取消','取消');
switch choice
case '确定'
BWim = im2bw(app.Temp_Image);%二值化
imshow(BWim,'Parent',app.Pri_Image);
app.Temp_Image = BWim;
return;
case '取消'
return;
end
6、图像二值化
将图像进行二值化
与上一点差不多,就少了个弹窗,这里就不放代码和截图了。
7、灰度变换
对图像进行指数变换和对数变换
这里我是做了一个弹窗来选择要进行哪种变换。
代码如下:
if isempty(app.Temp_Image)
return;
end
%读取原图
app.Temp_Image = app.Super_Image;
im = imread(app.Temp_Image);
[~,~,h] = size(im); % 获取原图像的大小
choice = questdlg('请选择要进行的变换操作','灰度变换','指数变换','对数变换','');
switch choice
case '指数变换'
if h==1
Grayim = double(im);
else
Grayim = double(rgb2gray(im));
end
Grayim2 = 1.5.^(Grayim*0.070)-1;
Grayim2 = uint8(Grayim2);
imshow(Grayim2,'Parent',app.Pri_Image);
app.Temp_Image = Grayim2;
return;
case '对数变换'
if h==1
Grayim = im2double(im);
else
Grayim = im2double(rgb2gray(im));%灰度化
end
Grayim2 = 2*log(Grayim+1);
imshow(Grayim2,'Parent',app.Pri_Image);
app.Temp_Image = Grayim2;
return;
end
实验结果如下,从左往右依次为:提示弹窗、指数变换和对数变换。我们可以看到,对数变换图像更亮,指数变换图像更暗,这是因为对数函数会扩张低灰度区域压缩高灰度区域,因此低灰度区域细节会增强,图像整体会变亮,而指数函数则相反。
8、镜像变换
对图像进行水平镜像、垂直镜像、以及水平垂直镜像的处理
将图片每行(列)元素的顺序翻转即可达到镜像的效果,在 MATLAB 中可使用 flip (A,dim) 函数实现,其中 A 为需要处理的对象,dim = 1 时为行翻转,dim=2 时为列翻转。
MATLAB 函数官方手册 flip (A,dim) 指路👉翻转元素顺序
代码如下:
if isempty(app.Temp_Image)
return