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

〇、写在前面

  本文为一个刚入门 MATLAB 的学生所写,内容是使用 APP Designer 做一个 GUI 界面的图像处理的小工具。还有很多不足,欢迎批评指正。
  APP Designer 学习教程指路MATLAB App Designer基础教程Matlab GUI界面设计
  作业要求指路数字图像处理之matlab大作业:自制图像处理小工具

一、设计思路

  最开始画的界面(左)和最终完成界面(右)如下图所示。
【学生作业】数字图像处理之MATLAB大作业:自制图像处理小工具_第1张图片
  我最开始的设计是有左右切换按钮的,但后来发现只做一页更加方便也更好看,所以就改了一下。

二、功能模块

  在开始敲代码之前,首先了解一下局部变量和全局变量。课程指路局部变量和全局变量的理解和类的解释
  我在这个作业中一共定义了四个全局变量:

    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);                %将全局图像显示在原图坐标区

  将以上代码添加到 “打开图像” 按钮回调函数中,可实现在文件夹获取图片的效果:

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

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

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

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

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

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

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

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

  实验结果如下,从左往右依次为:提示弹窗、指数变换和对数变换。我们可以看到,对数变换图像更亮,指数变换图像更暗,这是因为对数函数会扩张低灰度区域压缩高灰度区域,因此低灰度区域细节会增强,图像整体会变亮,而指数函数则相反。

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

8、镜像变换

对图像进行水平镜像、垂直镜像、以及水平垂直镜像的处理

  将图片每行(列)元素的顺序翻转即可达到镜像的效果,在 MATLAB 中可使用 flip (A,dim) 函数实现,其中 A 为需要处理的对象,dim = 1 时为行翻转,dim=2 时为列翻转。
  MATLAB 函数官方手册 flip (A,dim) 指路翻转元素顺序
  代码如下:

            if isempty(app.Temp_Image)
                return;
            end
            %读取原图
            app.Temp_Image = app.Super_Image;
            im = imread(app.Temp_Image);
            choice = questdlg('请选择要进行的操作','镜像变换','水平镜像','垂直镜像','水平垂直镜像','');
            switch choice
                case '水平镜像'
                    Image1=flip(im,2);%原图像的水平镜像
                    imshow(Image1,'Parent',app.Pri_Image);
                    app.Temp_Image = Image1;
                    return;
                case '垂直镜像'
                    Image1=flip(im,1);%原图像的垂直镜像
                    imshow(Image1,'Parent',app.Pri_Image);
                    app.Temp_Image = Image1;
                    return;
                case '水平垂直镜像'
                    Image1=flip(flip(im,1),2);%原图像的水平垂直镜像
                    imshow(Image1,'Parent',app.Pri_Image);
                    app.Temp_Image = Image1;
                    return;
            end

  实验结果如下图所示,左上到右下顺序依次为:弹窗、水平镜像、垂直镜像、水平垂直镜像。

9、目标检测

对两幅图像进行加减乘除的运算

  我们在课堂上学过,图像即矩阵,因此将图像加减乘除是有数学解释的。但不同大小的矩阵不能加减乘除,因此要求参与运算的两幅图像大小一致、数据类型一致。在我的作业中,第一张图片为 “打开图片” 按钮所选择的图片,在按下运算按钮后,会要求选择第二张图片。由于四种运算仅函数不同,我下面就只放图像相加的代码和截图。
  PS:图像相除所使用到的 imdivide (X,Y) 的参数必须是double类型,如果是整数,那么相除的结果就为0,就会得到一张黑色图片。
  图像相加代码如下:

            if isempty(app.Temp_Image)
                return;
            end
            %读取原图
            app.Temp_Image = app.Super_Image;
            im = imread(app.Temp_Image);
            %读取图像
            [filename, pathname]=uigetfile(...
                {'*.tif;*.bmp;*.png;*.jpg',...
                'Image Files(*.tif,*.bmp,*.png,*.jpg)'},...
                '选择图片');
            if isequal(filename,0) || isequal(pathname,0)
                return;
            else
                %记录获取文件的名字和路径
                Image = strcat(pathname,filename);
            end
            img=imread(Image);
            %图像相加
            Image1 = imadd(im,img);
            imshow(Image1,'Parent',app.Pri_Image);
            app.Temp_Image = Image1;

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

10、图像平滑

对图像添加噪声后再平滑处理去除噪声

10.1、添加噪声

  噪声主要分类为两类,高斯噪声和椒盐噪声。高斯噪声在每个像素上都会出现,赋值服从高斯分布。椒盐噪声出现位置随机,所以可以控制椒盐噪声的密度。下面我仅展示椒盐噪声的添加。

            if isempty(app.Temp_Image)
                return;
            end
            %读取原图
            app.Temp_Image = app.Super_Image;
            im = imread(app.Temp_Image);
            Image = mat2gray(im,[0 255]);
            Image1=imnoise(Image,'salt & pepper',0.2);  %添加椒盐噪声,密度为0.2
            imshow(Image1,'Parent',app.Pri_Image);
            app.Temp_Image = Image1;
            app.Change_Image = Image1;

  在添加噪声代码的最后一行,我将 Image1 的值赋给了全局变量 Change_Image ,这在 10.2 图像平滑 中会用到。

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

10.2、图像平滑

  对图像分别添加高斯噪声和椒盐噪声,并分别用均值滤波器、中值滤波器、高斯滤波器处理,并将处理结果显示在一张图中。下面我仅展示用上述三种滤波来去除椒盐噪声。

            if isempty(app.Change_Image)
                return;
            end
            im=app.Change_Image;
            %均值滤波
            result1=imfilter(im,fspecial('average',[3,3]),'replicate');
            %中值滤波
            [~,~,h] = size(im);  % 获取原图像的大小
            if h==1
                result2 = medfilt2(im);  % 如果只有一个通道说明是灰度图像,不需要做变换
            else
                result2=im;
                result2(:,:,1)=medfilt2(im(:,:,1),[3 3]);
                result2(:,:,2)=medfilt2(im(:,:,2),[3 3]);
                result2(:,:,3)=medfilt2(im(:,:,3),[3 3]);
            end
            %高斯滤波
            sigma1=0.6;r=3;  % 高斯模板的参数
            gausFilter1=fspecial('gaussian',[2*r+1 2*r+1],sigma1);
            result3=imfilter(im,gausFilter1,'conv');
            figure,subplot(131);imshow(result1);title('均值滤波处理后图像');
            subplot(132);imshow(result2);title('中值滤波处理后图像');
            subplot(133);imshow(result3);title('高斯滤波处理后图像');

  在代码的开头(第 4 行),我将 10.1 添加噪声 中已经被赋值的全局变量 Change_Image 赋值给 im ,达到在 10.2 平滑处理 中调用 10.1 添加噪声 最后处理结果的效果。

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

11、直方图均衡化

通过直方图均衡化增强图像对比度,使像素灰度值分布更均匀。

  在这一题中,我用了 axes 函数在指定位置绘制坐标区,并用 imhist 显示图像直方图。

            if isempty(app.Temp_Image)
                return;
            end
            %读取原图
            app.Temp_Image = app.Super_Image;
            im = imread(app.Temp_Image);
            axes(app.Ori_Plot)             %在Ori_plot绘制坐标区
            imhist(im)                     %在坐标区中显示直方图
            Image1=histeq(im);             %对原图像进行直方图均衡化处理
            imshow(Image1,'Parent',app.Pri_Image);
            app.Temp_Image = Image1;
            axes(app.Pri_Plot);            %在Pri_Plot绘制坐标区
            imhist(app.Temp_Image);        %显示直方图

【学生作业】数字图像处理之MATLAB大作业:自制图像处理小工具_第10张图片
  直方图均衡化后的图像对比度增强了,像素灰度值分布更加均匀了,看起来更亮更好看了。

12、边缘提取

使用锐化滤波器提取图像边缘

  空间滤波,就是在原图像上,用一个固定尺寸的模板去做卷积运算,得到的新图像就是滤波结果。滤波,就是过滤某种信号的意思。过滤哪种信号取决于模板设计,如果是锐化模板,处理后就保留高频信号。而一般图像边缘信号都较高,所以可以使用锐化模板设计滤波,从而达到提取图像边缘的效果。本题中我使用了四种算子进行滤波,分别是梯度算子、sobel算子、robert算子和Laplacian算子。下面仅对梯度算子进行展示,其他算子参考数字图像处理之matlab实验(三):空间滤波器。

            if isempty(app.Temp_Image)
                return;
            end

            %读取原图
            app.Temp_Image = app.Super_Image;
            im=imread(app.Temp_Image);
            [~,~,h] = size(im);  % 获取原图像的大小
            if h==1
                im = im2double(im);  % 如果只有一个通道说明是灰度图像,不需要做变换
            else
                im = im2double(rgb2gray(im));
            end

            %梯度算子
            [h,w]=size(im);
            edgeImage=zeros(h,w);
            for x=1:w-1
                for y=1:h-1
                    edgeImage(y,x)=abs(im(y,x+1)-im(y,x))+abs(im(y+1,x)-im(y,x));
                end
            end
            Image1 = edgeImage;
            imshow(Image1,'Parent',app.Pri_Image);
            app.Temp_Image = Image1;

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

13、形态学处理

使用形态学处理的基本运算腐蚀、膨胀、开运算和闭运算对图像进行处理

  形态学图像处理表现为一种领域运算形式,一种特殊定义的邻域称之为“结构元素”,在每个像素位置上它与二值图像对应的区域进行特定的逻辑运算,逻辑运算的结果为输出图像的相应像素。形态学运算的效果取决于结构元素的大小,内容以及逻辑运算的性质。
  形态学处理的基本运算包括腐蚀、膨胀、开运算和闭运算。
  腐蚀的作用是标记原图像中结构元素出现的位置,标记的位置为参考点所在的位置。
  膨胀,具有让二值图像视觉加粗的效果,膨胀的方向,取决于结构元素。
  开运算是用同一个结构元素对原图像先腐蚀后膨胀,可用于消除感兴趣目标外部孤立的噪声点和细长的毛刺(尺寸都要比结构元素小)。
  闭运算是用同一个结构元素对原图像先膨胀后腐蚀,可用于消除感兴趣目标内部的孔洞。
  在本题中针对彩色图像我采用了对三通道分别进行形态学处理的方式来达到对彩色图像进行形态学处理的效果。

            if isempty(app.Temp_Image)
                return;
            end

            %读取原图
            app.Temp_Image = app.Super_Image;
            im = imread(app.Temp_Image);
            SE=strel('square',5);          %创建结构元素
            [~,~,h] = size(im);  % 获取原图像的大小
            image = im2double(im);  % 运算的时候用double,为了保持运算精度

            %膨胀运算
            if h==1
                gray=image;  % 如果只有一个通道说明是灰度图像,不需要做变换
                result=imdilate(gray,SE);
            else
                result=im;
                result(:,:,1)=imdilate(im(:,:,1),SE);
                result(:,:,2)=imdilate(im(:,:,2),SE);
                result(:,:,3)=imdilate(im(:,:,3),SE);
            end
            Image1 = result;

            %腐蚀运算
            if h==1
                gray=image;  % 如果只有一个通道说明是灰度图像,不需要做变换
                result=imerode(gray,SE);
            else
                result=im;
                result(:,:,1)=imerode(im(:,:,1),SE);
                result(:,:,2)=imerode(im(:,:,2),SE);
                result(:,:,3)=imerode(im(:,:,3),SE);
            end
            Image2 = result;

            %开运算
            if h==1
                gray=image;  % 如果只有一个通道说明是灰度图像,不需要做变换
                result=imopen(gray,SE);
            else
                result=im;
                result(:,:,1)=imopen(im(:,:,1),SE);
                result(:,:,2)=imopen(im(:,:,2),SE);
                result(:,:,3)=imopen(im(:,:,3),SE);
            end
            Image3 = result;

            %闭运算
            if h==1
                gray=image;  % 如果只有一个通道说明是灰度图像,不需要做变换
                result=imclose(gray,SE);
            else
                result=im;
                result(:,:,1)=imclose(im(:,:,1),SE);
                result(:,:,2)=imclose(im(:,:,2),SE);
                result(:,:,3)=imclose(im(:,:,3),SE);
            end
            Image4 = result;

            %显示窗口
            figure,subplot(221),imshow(Image1),title('膨  胀');
            subplot(222),imshow(Image2),title('腐  蚀');
            subplot(223),imshow(Image3),title('开运算');
            subplot(224),imshow(Image4),title('闭运算');

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

14、频域处理

从频域对图像做平滑处理和提取边缘

  从频域对图像做平滑处理和提取边缘,平滑处理使用低通滤波器,边缘提取使用高通滤波器。本题使用了高斯滤波和巴特沃斯滤波对图像进行处理,仅展示高斯滤波的代码和截图。

            if isempty(app.Temp_Image)
                return;
            end
            %读取原图
            app.Temp_Image = app.Super_Image;
            im = imread(app.Temp_Image);

            %%实现高斯低通滤波
            A = im;
            [m,n] = size(A);
            A = im2double(A);
            F = fft2(A,2*m,2*n);
            F1 = fftshift(F);
            D0=50;%截止频率设置在半径值为50处
            H = GaussianLowpass(A,D0);
            G = F1.*H;
            F2 = ifftshift(G);
            output = ifft2(F2);
            output = output(1:size(A,1),1:size(A,2));
            Image2 = output;

            % 自定义函数构建高斯低通滤波器
            function H = GaussianLowpass(img,D0)

                [M,N] = size(img);
                H = zeros(2*M,2*N);

                for u = 1:2*M
                    for v = 1:2*N
                        D_square = (u-M) * (u-M) + (v-N) * (v-N);
                        H(u,v) = exp(-D_square/(2*D0*D0));
                    end
                end

            end


            %% 实现高斯高通滤波器
            A = im2double(im);
            [a,b] = size(A);
            F = fft2(A,2*a,2*b);
            F3 = fftshift(F);
            [a,b] = size(A);
            W = zeros(2*a,2*b);
            D0=50;
            for u = 1:2*a
                for v = 1:2*b
                    D_square = (u-a) * (u-a) + (v-b) * (v-b);
                    W(u,v) =1 - exp(-D_square/(2*D0*D0));
                end
            end
            G = F3.*W;
            F4 = ifftshift(G);
            F1 = ifft2(F4);
            F1 = F1(1:size(A,1),1:size(A,2));
            Image3 = F1;

            %显示窗口
            figure,
            subplot(131);imshow(im),title('原图');
            subplot(132);imshow(Image2),title('图像平滑');
            subplot(133);imshow(Image3),title('边缘提取');

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

15、图像复原

对图像做模糊和复原处理

  对原图做运动模糊,并进行图像复原处理,将原图、模糊图、恢复后的模糊图显示在一张结果图中。

            if isempty(app.Temp_Image)
                return;
            end

            %读取原图
            app.Temp_Image = app.Super_Image;
            im = imread(app.Temp_Image);
            Image1=im;

            %运动模糊
            PSF=fspecial ('motion',25,11);%运动模糊函数,运动位移是25像素,角度是11
            Blurred=imfilter (im,PSF, 'conv' , 'circular') ;%对图像运动模糊处理
            Image2 = Blurred;
            imshow(Image2,'Parent',app.Pri_Image);

            %图像复原
            Image3=deconvwnr (Blurred, PSF) ;%不带参数的维纳滤波(逆滤波)复原

            %显示窗口
            figure,subplot(131),imshow(Image1),title('原图');
            subplot(132),imshow(Image2),title('运动模糊后的图像');
            subplot(133),imshow(Image3),title('恢复后的模糊图');

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

16、图像分割

提取图像中特定颜色的部分

  本题我使用的是基于颜色的图像分割,参考博客指路使用MATLAB提取图片中特定颜色。我一共做了对四种颜色的提取(红、黄、蓝、绿),下面将仅对红色提取进行展示。

            if isempty(app.Temp_Image)
                return;
            end
            %读取原图
            app.Temp_Image = app.Super_Image;
            flag = imread(app.Temp_Image);
            % 将图像的rgb色彩空间转化至hsv色彩空间
            flag_hsv = rgb2hsv(flag);
            % 创建一个白色图像,将特定颜色提取到此处
            flag_new = 255*ones(size(flag));
            % 将该图像转至hsv色彩空间
            flag_new_hsv = rgb2hsv(flag_new);
            % 找出图像中红色的像素
            [row, col] = ind2sub(size(flag_hsv),find(flag_hsv(:,:,1)>0.8...
                & flag_hsv(:,:,1)< 1.0 & flag_hsv(:,:,2)>0.16 & flag_hsv(:,:,3)>0.18));
            % 将图像中的红色像素复制到刚才新建的白色图像中
            for i = 1 : length(row)
                flag_new_hsv(row(i),col(i),:) = flag_hsv(row(i),col(i),:);
            end
            [row, col] = ind2sub(size(flag_hsv),find(flag_hsv(:,:,1)>0.0...
                & flag_hsv(:,:,1)< 0.05 & flag_hsv(:,:,2)>0.16 & flag_hsv(:,:,3)>0.18));
            % 将图像中的红色像素复制到刚才新建的白色图像中
            for i = 1 : length(row)
                flag_new_hsv(row(i),col(i),:) = flag_hsv(row(i),col(i),:);
            end
            % 将提取出来的红色,转化至rgb空间,进行展示
            flag_red = hsv2rgb(flag_new_hsv);
            Image1 = flag_red;
            imshow(Image1,'Parent',app.Pri_Image);
            app.Temp_Image = Image1;

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

17、硬币检测及计数

读取硬币图片并计数

  参考博客指路数字图像处理之matlab大作业:自制图像处理小工具第 13 点。

17.1、读取图片

  读取图片时用到了全局变量 Count_Image ,用来储存硬币图片,以便在 17.2 硬币计数中使用。

            [filename, pathname]=uigetfile(...
                {'*.tif;*.bmp;*.png;*.jpg',...
                'Image Files(*.tif,*.bmp,*.png,*.jpg)'},...
                '选择图片');
            if isequal(filename,0) || isequal(pathname,0)
                return;
            else
                %记录获取文件的名字和路径
                app.Count_Image = strcat(pathname,filename);%将读取到的图像赋给硬币图像
            end
            %读取硬币图像
            im = imread(app.Count_Image);
            imshow(im,'Parent',app.Ori_Image);

17.2、硬币计数

            im = imread(app.Count_Image);
            BW=im2bw(im);
            SE=strel('square',6);
            result1=imopen(imclose(BW,SE),SE);               %先闭后开
            [L, NUM] = bwlabel(result1, 4); %检测二值图像中连通域的个数
            %[L, NUM] = bwlabel(BW, N)
            % BW 为输入二值化图像;
            % N 可取值为48表示连接四连通或八连通区域;
            % NUM 为找到的连通区域数目;
            % L 为输出图像矩阵,其元素值为整数,背景被标记为0,第一个连通区域被标记为1,第二个连通区域被标记为2,依此类推.1,2,3即为第1,2,3个连通区域的标记
            S=sprintf('检测到的硬币个数为:%d',NUM);msgbox(S);%弹窗显示运行结果

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

18、形状检测

识别图像中的特定形状并标识出来

  参考博客指路数字图像处理之matlab大作业:自制图像处理小工具第 14 点。下面仅对检测圆形进行展示。

            if isempty(app.Temp_Image)
                return;
            end
            %读取原图
            app.Temp_Image = app.Super_Image;
            im = imread(app.Temp_Image);
            image=rgb2gray(im);
            BW=edge(image,'canny');
            SE=strel('disk',5);
            Morph=imclose(BW,SE);
            Morph=imfill(Morph,'holes');
            [B,L]=bwboundaries(Morph);
            figure,imshow(L),title('红色所示即为圆形');
            STATS = regionprops(L,'Area', 'Centroid','BoundingBox');
            len=length(STATS);
            hold on
            for i=1:len
                R=STATS(i).Area/(STATS(i).BoundingBox(3)*STATS(i).BoundingBox(4));
                boundary=fliplr(B{i});
                everylen=length(boundary);
                F=4*pi*STATS(i).Area/(everylen^2);
                dis=pdist2(STATS(i).Centroid,boundary,'euclidean');
                miu=sum(dis)/everylen;
                sigma=sum((dis-miu).^2)/everylen;
                C=miu/sigma;
                if R>pi/4-0.1 && R<pi/4+0.1 && F>0.9 && C>10
                    rectangle('Position',[STATS(i).Centroid(1)-miu,STATS(i).Centroid(2)-miu,2*miu,2*miu],...
                        'Curvature',[1,1],'edgecolor','r','linewidth',2);
                    plot(STATS(i).Centroid(1),STATS(i).Centroid(2),'r*');
                end
            end
            hold off

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

19、附加功能

19.1、羊了个羊

咩咩咩咩咩咩咩咩

  来源于微信公众号:slandarer随笔 。原文链接MATLAB | 使用MATLAB制作羊了个羊小游戏

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

19.2、粒子爱心

沉沦的心,依旧为天空和大地跳动

  来源于微信公众号:slandarer随笔 。原文链接MATLAB | 两款粒子爱心 复刻《点燃我,温暖你》


  直接关闭这个窗口的话会报错,但是也没有太大的影响。

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

19.3、画朵玫瑰

这无垠的宇宙对我都是虚幻,你才是我的玫瑰,我全部财产。—— 莎士比亚

  来源于微信公众号:渝西图像练习生 。原文链接【Matlab画一朵玫瑰花】祝天下老师教师节快乐

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

19.4、扫个雷吧

3,2,1,boom !

  直接调用 MATLAB 自带函数 xpbombs() 实现效果。

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

三、一些小技巧

1、快速查看帮助

  在 MATLAB 命令行内输入 ** help 函数名**( help 后有一个空格)可以快速查看函数的使用方法。比如我要查询 imread 这个函数的用法,只需要在 MATLAB 命令行输入 help imread,就能看到该函数的使用方法。

【学生作业】数字图像处理之MATLAB大作业:自制图像处理小工具_第22张图片
  另外,输入doc 函数名( doc 后有一个空格),可以快速打开该函数的帮助文档,这里就不做演示了。

2、实时脚本

  在使用 MATLAB 时,代码的运行结果往往是靠弹窗显示的,而实时脚本能在代码的每一步运行完之后将结果在右侧显示。

【学生作业】数字图像处理之MATLAB大作业:自制图像处理小工具_第23张图片
  在右侧也可以切换显示模式:结果显示在右侧,结果显示在每一步代码下方,只显示结果。

【学生作业】数字图像处理之MATLAB大作业:自制图像处理小工具_第24张图片
【学生作业】数字图像处理之MATLAB大作业:自制图像处理小工具_第25张图片
  打开实时脚本也很简单,点击主页,新建实时脚本,然后点击实时编辑器就可以使用了。
【学生作业】数字图像处理之MATLAB大作业:自制图像处理小工具_第26张图片

这篇文章到这里就结束啦,感谢观看~ ~ ~

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