Bootstrap

【学生作业】数字图像处理之MATLAB大作业:自制图像处理小工具

〇、写在前面

  本文为一个刚入门 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
;