期末大作业之Matlab美图秀秀【GUI界面】 您所在的位置:网站首页 matlab做人机界面 期末大作业之Matlab美图秀秀【GUI界面】

期末大作业之Matlab美图秀秀【GUI界面】

2023-07-03 12:31| 来源: 网络整理| 查看: 265

一、任务描述 该项目是基于MATLAB+Python+opencv的美图秀秀工具包,且实现了GUI可视化界面。工具包括图像处理基础功能,如选择保存撤销图片、摄像头拍照、特征点定位、退出等;基本编辑功能,如裁剪、镜像、对比度、旋转、亮度、模糊、锐化等;人脸美化功能,如磨皮、美白、祛痘、大眼、口红、眉毛、腮红、瘦脸等;滤镜特效功能,如浮雕、素描、老照片、交叉冲印、油画、动漫、羽化等;且增加玩法功能,可实现一图转为九宫格图、图像合成、生成电子签名,以及证件照换底色、人脸表情识别、艺术字签名。 二、设计思路 该程序设计思路来源于图像处理类APP,如美图秀秀、醒图、美颜相机等,结合多种APP,归纳图像处理基础功能以及人脸美化功能,同时参考借鉴其创新玩法功能。此外,联系课堂所学知识,归纳可取功能点。最终,形成程序功能设计思维导图,如下所示: 在这里插入图片描述 三、功能模块

在这里给大家分享其中动漫滤镜、特征点定位、大眼、口红、眉毛、腮红、瘦脸、贴纸功能模块。

1 动漫滤镜

实现步骤 1.python调用百度API实现人像动漫化。 参考如下:https://blog.csdn.net/qq_37273544/article/details/104197205

2.将python程序打包exe。 安装pyinstaller:pip install pyinstaller 打包exe:pyinstaller 文件名.py

3.matlab调用Python程序,找到所生成图像途径并显示。

command = ‘exe路径’; status = system(command);

实现效果 在这里插入图片描述 2 特征点定位

算法原理 使用Dlib模型思想,提取人脸特征点是用 68 个点包围每个部位。Dlib所采用的68个人脸关键点标注可以看下图,单边眉毛有5个关键点,从左边界到右边界均匀采样,共5×2=10个。眼睛分为6个关键点,分别是左右边界,上下眼睑均匀采样,共6×2=12个。嘴唇分为20个关键点,除了嘴角的2个,分为上下嘴唇。上下嘴唇的外边界,各自均匀采样5个点,上下嘴唇的内边界,各自均匀采样3个点,共20个。鼻子的标注增加了鼻梁部分4个关键点,而鼻尖部分则均匀采集5个,共9个关键点。脸部轮廓均匀采样了17个关键点。 在这里插入图片描述 原理参考资料: https://blog.csdn.net/cungudafa/article/details/93493229

在本程序中,创建meanshapecmu.dat的Dilb特征点库,以及可使用鼠标进行交互式点击眼球中心、嘴唇中心,以及手动移动特征点坐标,从而提高定位精度。 在这里插入图片描述

主界面代码

global d1 global d2; global picture; set(handles.text7,‘string’,‘请选择一张照片!!’); set(handles.text7,‘FontSize’,12); [filename, pathname] = uigetfile({‘.jpg’;'.tif’;‘.bmp’;'.gif’},‘选择图片’); % 合成路径+文件名 if isequal(filename,0)||isequal(pathname,0) warndlg(‘没有选中文件!’,‘警告’); return else str = [pathname,filename];% 读取图片 d1=pathname; d2=filename; [X,Y]=Edit68Dilb(d1,d2,picture);

主函数代码

function [X,Y]=Edit68Dilb(d1,d2,image) meanshape68 = load(‘meanshapecmu.dat’); meyemouth = ([meanshape68([29,35,63],)]+[meanshape68([32,38,67],)])/2; mtri= load(‘meantri.dat’); pathname=d1; filename=d2; Aim=image; [hei,wid]=size(Aim); figure(2);imshow(Aim,[]); landmarkfile = [filename(1:find(filename==‘.’)-1),‘.lmk’]; box=ones(1,4); box(3:4)=[size(Aim,2)-1,size(Aim,1)-1]; if( isempty(dir( [pathname,landmarkfile] )) ) %标记一张新面孔 title(‘依次点击左眼、右眼和嘴唇中心 ‘); %输入眼睛和嘴巴中心 inem = ginput(3); bx=max(inem(:,1)) - min(inem(:,1)); by=max(inem(:,2)) - min(inem(:,2)); box=[max(1,inem(1,1)-bx),max(1,inem(1,2)-by),3bx,3by ]; inem = inem-[1;1;1]*box(1:2)+1; T = CalcAffineCo(meyemouth,inem); Xo = T(1)*meanshape68(:,1) + T(2)*meanshape68(:,2)+T(5); Yo = T(3)meanshape68(:,1) + T(4)meanshape68(:,2)+T(6); else %加载.lmk并编辑 sh=load([pathname,landmarkfile]); bx = max(sh(:,1))-min(sh(:,1)); bx = bx /4; by = max(sh(:,2))-min(sh(:,2)); by = by /4; box(1:2) = [ max(1,min(sh(:,1))-bx),max(1,min(sh(:,2))-by) ]; box(3:4) = [ min(wid,max(sh(:,1))+bx-box(1))-1,min(hei,max(sh(:,2))+by-box(2))-1 ]; Xo=sh(:,1)-box(1)+1; Yo=sh(:,2)-box(2)+1; end im=imcrop(Aim,box); figure(1);imshow(im,[]); %Maximize(1); hold on, h1 = plot(Xo(1:17),Yo(1:17),‘w-’,Xo(18:27),Yo(18:27),‘w-’,Xo(49:68),Yo(49:68),‘w-’,‘Linewidth’,1); h2 = plot(Xo,Yo,'‘,‘Linewidth’,4); %% 移动两个点 while 1 figure(1);hold on, title(’!!调整位置(单击左键) OR 保存位置文件(单击右键)!!'); try [xc,yc]=ginput(1); catch break end %选择最近的点 [val,ind]=min((xc-Xo).^2 + (yc-Yo).^2); title('单击左键选择要调整的点,再单击左键选择要将此点调整到的位置;单击右键退出调整保存文件 ‘); try [xc,yc]=ginput(1); catch break end Xo(ind)=xc; Yo(ind)=yc; delete(h1);delete(h2); h1 = plot(Xo(1:17),Yo(1:17),‘w-’,Xo(18:27),Yo(18:27),‘w-’,Xo(49:68),Yo(49:68),‘w-’,‘Linewidth’,1); h2=plot(Xo,Yo,’’,‘Linewidth’,4); drawnow(‘expose’); end X = Xo+box(1)-1; Y = Yo+box(2)-1; landmarkfile=[filename(1:find(filename==’.‘)-1),’.lmk’]; fid = fopen( [pathname,landmarkfile], ‘w’); fprintf(fid,‘%6.2f %6.2f\r\n’, [X,Y]'); fclose(fid); figure(2);imshow(Aim,[]); plotface(2,X,Y,mtri); L=1; for i=1:68 L=L+1; text(X(i)+0.1,Y(i)+0.1,num2str(L-1)); %利用十个点的坐标添加对应标注 %适当增加一些距离,让文字和点分开会美观一些 end figure(gcf);

实验结果 在这里插入图片描述 3 大眼

算法原理 获取鼠标点击眼球坐标,设为放大中心点坐标,以此点为圆心,r为放大半径向外扩圆,达到大眼效果。

算法设计

function J=bigger(I,pointx,pointy,r) %I为原图像,pointx和pointy为放大中心点坐标,r为放大半径 im=I; %分别得到放大区域的上下左右坐标 left=round(pointy-r); right=round(pointy+r); top=round(pointx-r); bottom=round(pointx+r); %放大区域面积 space = r * r; strength=30; %放大强度 %原图像为彩色图像,要分成RGB三个分量进行处理 fr=im(:,:,1); fg=im(:,:,2); fb=im(:,:,3); im2fr=fr; im2fg=fg; im2fb=fb; %插值算法 for x=top:bottom offsetx=x-pointx; for y=left:right offsety=y-pointy; xy=offsetxoffsetx+offsetyoffsety; if xyX(49) && iX(52) && iX(27) && ipolyval(p1,i)-2&&jX(27)+(X(23)-X(27))/7 && ipolyval(p1,i)-4&&jX(22) && ipolyval(p2,i)-4&&jX(22)+(X(18)-X(22))/76 && ipolyval(p2,i)-2&&j



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有