目录
实验描述
该项目中运用Matlab制作GUI界面,主要实现图像编辑和人像美化两大模块功能。
对于图像编辑模块,主要负责对图像信息进行处理,其中涉及到图像数字化、分割、识别、复原、增强等操作,以及点处理、组处理和几何处理等方法。该模块中功能板块分为系统操作、基础操作、调色、滤镜。其中系统操作包括:打开图片、从摄像头获取、保存图片、特征点定位、重置、退出这6个功能按键。基础操作包括裁剪、抠图、水平翻转、垂直翻转、旋转、锐化。调色包括亮度、饱和度、对比度、色调、色温。滤镜包括黑白照、光照、怀旧色、浮雕、底片效果、动感模糊、灰度胶片、艺术噪声、油画、素描、羽化。
对于人像美化模块,主要负责调整人物肤色,消除面部痘斑等,以及对图像进行趣味改造和添加装饰。该模块中功能板块分为系统操作、美颜操作、贴纸、相框、其他。其中系统操作与图像编辑一致。美颜操作包括美白、磨皮、大眼、白牙、图像合成、祛痣祛痘、马赛克这8个功能,不同功能使用滑块和按钮完成。贴纸板块中主要包含4种人脸贴纸,有兔耳朵、猫耳朵、腮红和狗狗脸。相框板块主要包含4种不同风格相框,每种相框都能适应图像大小,完整与图像贴合。其他板块中,主要针对一些特殊功能,有生成证件照、添加文本、四宫格拼图、九宫格拼图、添加水印。
github地址:https://github.com/22609hui/MATLAB_GUI.git
整体架构流程
GUI界面
功能实现
1、从摄像机获取
使用摄像机进行拍照,需要配置两个附件功能,有这两个功能后才能实现摄像机调用和图片获取。
从摄像头获取按钮代码:
首先定义全局变量vid,用于存储相机对象。为了能进行拍摄,可以使用getsnapshot(vid)从设想头设备中获取一帧图像数据,并存储在data中。然后编写三行代码set(vid,'TriggerRepeat',Inf);set(vid,'FramesPerTrigger',1);set(vid,'FrameGrabInterval',1);用于设置摄像头对象的参数,设置重复触发、每触发一次获取一帧、帧抓取间隔为 1 帧。这样摄像机捕获到的每一帧图像就连成一个视频。并获取摄像头设备视频的分辨率和彩色通道数,并存储。后选择axes1,将摄像头捕获的画面实时显示在axes1中,然后使用image函数创建一个与摄像头分辨率相匹配的图像hImage,并使用preview()函数将图像显示在axes1控件上。这样摄像机捕获的画面就实时展示在axes中。
%从摄像机获取
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton5 (see GCBO)
h = waitbar(0.1,'请稍等,正在检查设备......');
global vid
vid = videoinput('winvideo',1);
vid_src=getselectedsource(vid);
data = getsnapshot(vid);
waitbar(0.5,h,'请稍等, 正在初始化窗口');
set(vid,'TriggerRepeat',Inf);
set(vid,'FramesPerTrigger',1);
set(vid,'FrameGrabInterval',1);
vidRes = get(vid, 'VideoResolution');
nBands = get(vid, 'NumberOfBands');
axes(handles.axes1);
waitbar(0.8,h,'请稍等, 正在初始化窗口');
set(handles.radiobutton5,'visible','on') %将单选按钮显示出来
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
% 将图像展示在GUI中
axes(handles.axes1);
waitbar(1.0,h,'请稍等, 正在初始化窗口');
close(h);
preview(vid, hImage);
确认拍摄单选按钮代码:
设计了一个单选按钮,用于表示确认拍摄。当选中时,就使用getsnapshot(vid)获取到摄像机中的当前帧图像并存在frame中,显示在axes中,并将当前图像handles.img设置为当前获取到的图像frame。同时将获取带的图像根据格式存储在当前文件夹中。最后将单选按钮隐藏即可。
%确认拍摄(图片编辑)
% --- Executes on button press in radiobutton5.
function radiobutton5_Callback(hObject, eventdata, handles)
% hObject handle to radiobutton5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of radiobutton5
global vid
if (vid==-1)
msgbox('Prview First ','www.matlabgui.cn','icon','error');
return;
end
frame = getsnapshot(vid);
axes(handles.axes1);%使用第一个axes
imshow(frame);%显示图片
handles.img=frame;
guidata(hObject,handles);
imshow(frame);
str=datestr(now);
str=strrep(str,':','_');
str=strrep(str,' ','_');
str=strrep(str,'-','_');
str=strcat(str,'.jpg');
imwrite(frame,str,'jpg');
set(handles.radiobutton5,'visible','off');%将单选按钮隐藏
实验结果:
2、裁剪
对于图像裁剪,没有采用简单的在代码中指定好要裁剪的区域,进行固定的裁剪,而是选择交互式裁剪方式,使用imrect函数来自主选择区域裁剪。同时在区域框选完成后,并不会直接进行裁剪,而是会等待用户完成选择,用户可以随意调节选矿大小、位置。最后双击完成选择。
global T;
T=handles.img;
if handles.img==0
msgbox('处理失败,请选择图像','error');
return;
else
axes(handles.axes1);
imshow(handles.img);
rect=imrect;%使用 imrect 函数创建一个可拖动的矩形框,允许用户在图像上选择裁剪区域
position=wait(rect);%等待用户完成选择。
I=imcrop(handles.img,position);%使用 imcrop 函数根据用户选择的矩形框位置裁剪图像。
end
axes(handles.axes2);
imshow(I);
handles.img=I;
guidata(hObject,handles);
实验结果:
3、抠图
首先