目录
-
实验描述
本文章是基于MATLAB数字图像处理课程的结课作业,利用MATLAB设计了可视化界面进行基础版图像处理,其中功能包括作业要求的功能,额外还设计了一些创新功能,包括但不限于相对亮度调整、返回上一步等。其中内容多来自于课程内容和上网查询资料获取到的内容的融会贯通,通过本次实验,完成了图像处理app的实现可以进行简单的图像处理,以及特殊功能检测。
-
设计思路
-
功能模块
-
基础界面
-
开发工具
MATLAB R2021a App Designer
-
基础功能
-
最重要的全局变量(写在前面)
properties (Access = private)
originalpicture; % Description
lastpicture;
changedpicture;
changedpicture2;
upgradepicture;
D0;
end
-
导入图片
函数uigetfile()打开文件选择对话框,选择文件,返回文件名和文件路径。有了文件名和文件路径后读文件函数读取相应的文件,将返回的文件路径和文件名赋给图片,使用imshow将其显示在界面指定位置上。如果未选择文件则弹出窗口,显示提醒未选择图片,然后返回图像界面。
[filename,pathname] = uigetfile({'*.jpg';'*.bmp';'*.*'},'选择图片');
if isequal(filename,0)||isequal(pathname,0)
msgbox('您未选择图片','温馨提示','help');
return;
else
x=strcat(pathname,filename);
app.originalpicture=imread(x);
imshow(app.originalpicture,'Parent',app.UIAxes1);
app.lastpicture=app.originalpicture;
app.changedpicture=app.originalpicture;
end
若不选择图像,点击取消的话会弹出提醒窗口
-
从摄像头获取照片
使用videoinput函数生成窗口对象并同步画面。利用函数获取图片的帧,当关闭窗口时,将关闭窗口时的截取图像显示在规定的坐标中。
obj = videoinput('winvideo',1);
h=preview(obj);
while ishandle(h)
app.originalpicture = getsnapshot(obj); % 获取帧
app.changedpicture=app.originalpicture;
imshow(app.originalpicture,'Parent',app.UIAxes1);
title(app.UIAxes1,'原始图片');
drawnow
end
-
彩色图像灰度化
利用im2gray()函数将彩色影像RGB转换成灰度影像Grayscale,由im2gray创建的灰度图像是一个由强度值组成的单一平面。im2gray函数将RGB值转换为灰度值,将R、G、B分量加权和:0.2989*R+0.5870*G+0.1140*B。
if isequal(app.originalpicture,'')
msgbox('无图片','提示',"help");
else
gray=im2gray(app.originalpicture);
app.lastpicture=app.changedpicture;
imshow(gray,'Parent',app.UIAxes2);
app.changedpicture=gray;
end
-
灰度图像二值化
函数im2bw使用阈值(threshold)变换法把灰度图像(grayscale image)转换成二值图像。所谓二值图像, 一般意义上是指只有纯黑(0)、纯白(255)两种颜色的图像。BW = im2bw(I,level),其将灰度图像 I 转换为二进制图像。输出图像 BW 将输入图像中亮度值大于 level 的像素替换为值1 (白色),其他替换为值0(黑色)。你指定 level 在 [0,1]之间,不用管输入图像的等级。函数graythresh 能用来自动计算变量 level 。如果你不指定 level ,im2bw 使用 0.5。
if isequal(app.originalpicture,'')
msgbox('无图片','提示',"help");
else
black=im2bw(app.originalpicture);
app.lastpicture=app.changedpicture;
imshow(black,'Parent',app.UIAxes2);
app.changedpicture=black;
end
-
两幅图像叠加
进行两幅图像的加法,或者给一幅图像加上一个常数,可以调用imadd函数来实现。imadd函数将某一幅输入图像的每一个像素值与另一幅图像相应的像素值相加,返回相应的像素值之和作为输出图像。Z = imadd(X,Y),其中,X和Y表示需要相加的两幅图像,返回值Z表示得到的加法操作结果。
[filename,pathname] = uigetfile({'*.jpg';'*.bmp';'*.*'},'选择图片');
if isequal(filename,0)||isequal(pathname,0)
msgbox('您未选择图片','温馨提示','help');
return;
else
x=strcat(pathname,filename);
addpic=imread(x);
imshow(addpic,'Parent',app.UIAxes2);
end
result=imadd(app.originalpicture,addpic);
imshow(result,'Parent',app.UIAxes3);
-
目标检测(两幅图像相减)
图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。imsubtract函数可以将一幅图像从另一幅图像中减去,或者从一幅图像中减去一个常数。imsubtract函数将一幅输入图像的像素值从另一幅输入图像相应的像素值中减去,再将这个结果作为输出图像相应的像素值。Z = imsubtract(X,Y),其中,Z是X-Y操作的结果。以下代码首先根据原始图像生成其背景亮度图像,然后再从原始图像中将背景亮度图像减去,从而生成减去后的图像。
[filename,pathname] = uigetfile({'*.jpg';'*.bmp';'*.*'},'选择图片');
if isequal(filename,0)||isequal(pathname,0)
msgbox('您未选择图片','温馨提示','help');
return;
else
x=strcat(pathname,filename);
targetpic=imread(x);
imshow(targetpic,'Parent',app.UIAxes2);
end
result=imabsdiff(targetpic,app.originalpicture);
imshow(result,'Parent',app.UIAxes3);
app.changedpicture=result;
图像的相减可以用来检测两幅图中不同的部分,检测图像之间的差异,增强细节,也可以用于一幅图像减去像素值,使图片变暗。但需要注意的是,相减的两幅图像尺寸应该相同。
-
图像灰度变换(指数变换、对数变换)
采用log函数进行对数变换(参数值必须为double类型),用im2uint8()函数将灰度图像转换为8位图,可视化显示新生成的图。指数变换能增强图像中亮区域的细节(对比度提高),同时弱化图像中暗区域的细节(对比度降低)。
%指数变换
app.lastpicture=app.changedpicture;
if isequal(app.originalpicture,'')
msgbox('无图片','提示',"help");
else
if (ndims(app.originalpicture)==3)
app.originalpicture=rgb2gray(app.originalpicture);
end
A1 = double(app.originalpicture);
A2 = 1.5.^(A1*0.070)-1;
A2 = uint8(A2);
imshow(A2,'Parent',app.UIAxes2);
app.changedpicture=A2;
%对数变换
app.lastpicture=app.changedpicture;
if isequal(app.originalpicture,'')
msgbox('无图片','提示',"help");
else
if (ndims(app.originalpicture)==3)
app.originalpicture=rgb2gray(app.originalpicture);
end
h=log(1+double(app.originalpicture));
h=mat2gray(h);
h=im2uint8(h);
imshow(h,'Parent',app.UIAxes2);
app.changedpicture=h;
end
(指数)
(对数)
指数变换能增强图像中亮区域的细节(对比度提高),同时弱化图像中暗区域的细节(对比度降低),而对数变换可以增强低灰度,减弱高灰度值。