任务说明

在这个项目中,我们以萌萌哒的熊猫头作为背景,然后试着在背景图上加入朋友们的照片。效果如下图所示:


实现步骤

  • 导入朋友的照片(前景照片);

  • 处理前景照片(缩放、旋转,填充);

  • 导入熊猫头照片(背景照片);

  • 将前景和背景拼接起来形成表情包;

  • 在表情包下面添加文字。


1 .导入前景图

本文采用的是个人的自拍照作为前景图。

% 1 .导入前景图
A = imread('sm1.jpg');
image(A);

由size(A)可获得 A图片尺寸大小


2.等比例缩放前景照片

图片尺寸有点大,因此需要缩放一下。

% 2.等比例缩放前景照片
image_resize=imresize(A,0.3,'nearest');
image(image_resize);

可以看到尺寸明显减小。我们再size看看:

确实小了好多。


3.对前景照片进行灰度处理

% 3.对前景照片进行灰度处理
[d1,d2,d3]=size(image_resize);
if(d3 > 1)image_resize = rgb2gray(image_resize);%如果是灰度图就不用先变换image(image_resize);
end
img_gray = double(image_resize) / 255;
img_gray = uint8(255 * img_gray * 0.5 + 0.5);
imshow(img_gray);

可以看出,确实变灰了,这一步骤是方便下一步二值化的操作。


4.对前景照片进行二值化处理

对于二值化,相信大家都不陌生,就是把图片变成非黑即白的。

然而,在度娘以及各大博客,所述的二值化操作都是自动化的二值,即代码如下:

thresh=graythresh(img_gray);                %自动确定二值化阈值
image_binary=imbinarize(img_gray,thresh);   %对图像二值化
image(image_binary)

采用 graythresh() 函数自动计算阈值。但是用它计算出来的阈值事实上是不太适合有光影的人脸图片的。因此需要手动调节,自己找到最佳效果的阈值点。

本文所用图片,通过该函数计算所得阈值为 thresh=0.2824

而小编通过手动调节,较佳的阈值为 thresh=35/255≈0.1372

其结果如下:

thresh 0.2824 0.1372
效果图

代码如下:

% 4.对前景照片进行二值化处理
thresh=graythresh(img_gray);%确定二值化阈值
image_binary1=imbinarize(img_gray,36/255);%对图像二值化
image(image_binary1);

通过二值处理的图片会变成单通道,无法进行正常的image打印输出,强行输出,会出现下图情况---一片蓝色:

因此需要将该单通道数据赋值到RGB各通道上,进行补色。

image_binary(:,:,1)=image_binary1;
image_binary(:,:,2)=image_binary1;
image_binary(:,:,3)=image_binary1;
image(image_binary);

这样我们就可以在figure里获得一张正常的视图了,如下图:


5.提取出感兴趣区域

接下来就是提取脸部成分,我们通过matlab的figure界面上的工具,结合截图工具,抓取我们想要的区域坐标情况,如图:

我们要抓取 x∈[108, 266],y∈[186, 340] 的区域。

% 5.提取出感兴趣区域
image_roi1 = image_binary(186:340, 108: 266);
image(image_roi1);

通过输出,也发现是一片蓝:

这个蓝色看起来还有一丝恐怖,我们用上面的方法进行补色:

image_roi(:,:,1)=image_roi1;
image_roi(:,:,2)=image_roi1;
image_roi(:,:,3)=image_roi1;
image(image_roi);

这下就回阳了:


6.旋转图片
7.将一些不需要的黑色区域删除掉
8.再次提取感兴趣区域并缩放

咋们这脸还是挺端正的不需要作什么旋转之类的操作吧,将就就这样。你们的图片素材需要的话,自己研究一下旋转操作,挺简单的。

可以参考一下这篇文章:https://www.cnblogs.com/cofludy/p/7953744.html


9.导入背景图片

% 9.导入背景图片
background = imread('back.jpg');
image(background);
background_resize=imresize(background,0.7,'nearest');
[d1,d2,d3]=size(background_resize);
if(d3 > 1)background_resize = rgb2gray(background_resize);%如果是灰度图就不用先变换image(background_resize);
end
background_resize1(:,:,1)=background_resize;
background_resize1(:,:,2)=background_resize;
background_resize1(:,:,3)=background_resize;
image(background_resize1);

就是它了:


10.组合两张图片成表情包

% 10.组合两张图片成表情包
image_roi = im2uint8(image_roi);
[h_f, w_f, c_f] = size(image_roi);
[h_b, w_b, c_b] = size(background_resize1);left = (w_b - w_f) / 2;   % 前景图片在背景图片中的左边的横坐标
right = left + w_f;       % 前景图片在背景图片中的右边的横坐标
top = 75;                 % 前景图片在背景图片中的上边的纵坐标% top的值不同的前景图或背景图或许都需要改改参数哦
bottom = top + h_f;       % 前景图片在背景图片中的下边的纵坐标emoji = background_resize1;
emoji(top: bottom-1, left: right-1,:) = image_roi;
image(emoji);
imwrite(emoji,'test.jpg');  % 保存模板图

一个基本的模板图就出来了,并且也保存到本地了,可以在其他平台上对该模板进行花样操作啦。


11.在表情包下面添加文本

% 11.在表情包下面添加文本
text(90,340,'死亡凝视-!','color','black','FontSize',38);

text()函数可以在figure界面输出文字,效果如下:

好嘞,咋们的表情包就做出来啦。

接下来咋们只需要用截图工具截屏就可以当做表情包啦:


结语

本项目基本流程就这样,是不是挺简单的啊~~~

Matlab 把你变成表情包 - 表情包生成相关推荐

  1. matlab:线性规划实例编程---采用linprog包

    线性规划再工程.生产等行业的应用非常广,这些问题通常是关于带目标函数的约束优化问题,亦即是我们比较常见的约束优化问题.在解决这类问题时,matlab提供了内置线性函数包linprog包. 具体的调用方 ...

  2. Go 学习笔记(3)— 包概念、包特点、包名约束、main 包、包的声明、包的引用、包初始化

    1. 包的概念 Go 语言是使用包来组织源代码的,并实现命名空间的管理.任何源代码文件必须属于某个包.源码文件的第一行有效代码必须是 package pacakgeName 语句,通过该语句声明自己所 ...

  3. 全网最简单的网络图画法,小白福音包学包会

    全网最简单的网络图画法,小白福音包学包会 徐锐(助理研究员),广东省生态环境技术研究所,土壤微生物与宏基因组方向 版本1.0.1,更新日期:2020年6月23日 本项目永久地址:https://git ...

  4. 包吃包住包机票的培训你见过吗?云南高通量条形码培训班,截止5月31日

    文章目录 2019年中国云南高通量条形码培训班 划重点 简介 日程 申请 授课教师 课程安排 培训地点 旅行 要求 参考文献 猜你喜欢 写在后面 2019年中国云南高通量条形码培训班 2019年云南高 ...

  5. 三线表是什么?R语言使用table1包绘制(生成)三线表、构建不分层的三线表

    三线表是什么?R语言使用table1包绘制(生成)三线表.构建不分层的三线表 目录

  6. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义函数在三线表中添加p值

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义函数在三线表中添加p值 目录

  7. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、设置transpose参数转置三线表、变量作为列,子组(strata)作为行

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.设置transpose参数转置三线表.变量作为列,子组(strata)作为行 目录

  8. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、自定义overall的标签名称

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.自定义overall的标签名称 目录

  9. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、为指定变量添加单位信息、自定义overall的标签名称

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.为指定变量添加单位信息.自定义overall的标签名称 目录

  10. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、为不同的变量显示不同的统计信息

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义三线表结构(将因子变量细粒度化重新构建三线图).为不同的变量显示不同的统计信息 目录

最新文章

  1. Codeforces Round #300 A. Cutting Banner 水题
  2. windows7 RDP修改
  3. 香港科技园公司“牵手”腾讯 共推香港金融科技发展
  4. QJson生成文件和解析文件
  5. 线性回归csv数据集_数据科学的基石:统计学、机器学习、计算机科学(三)——线性回归...
  6. 使用宝塔面板进行wordpress建站
  7. DDOS***类型以及iptables防范ddos脚本
  8. php程序转net,asp,asp.net,php,jsp下的301转向代码,整站重定向
  9. DataRow 点不出 Select
  10. cacti-0.8.8a那点儿事
  11. ❤️《大前端—Webpack》
  12. python对文件操作的相关函数_第六章、Python文件操作
  13. java.rmi.ConnectException: Connection refused to host:
  14. 服务器物理硬盘序列号,服务器硬盘序列号查看
  15. 怎么在HTML图片中加文字,网页制作时如何给图片添加文字?
  16. redis 集群 set key报错CLUSTERDOWN Hash slot not served
  17. 4399小游戏怎样下载到本地玩
  18. 计算机网络(第八版)谢希仁
  19. 如何理解零知识 zkSNARK应用中的Nullifier Hash攻击?
  20. 益聚星荣:如何有理有据地给元宇宙泼一盆冷水?

热门文章

  1. 【vue】时间戳、中国标准时间等格式转换时间样式(yyyy-MM-dd)
  2. 如何使用idm下载百度网盘的资源
  3. Oracle-创建Oracle用户修改密码并赋权限
  4. OpenGL 纹理映射
  5. 关于程序员的学习方法的一些总结
  6. python中延时函数_python开发--Python实现延时操作的几种方式
  7. python延时程序不能用_Python延迟绑定问题原理及解决方案
  8. php双向验证SSL,php curl实现https双向认证的实例代码
  9. 彻底删除Ubuntu启动项
  10. 《数据管理能力成熟度评估模型》指南