这学期选修了计算机视觉与模式识别这门课,刚上几周,感觉挺有趣的。

课程上到Image Warping & Morphing的时候老师介绍了一样挺好玩的东西,我用它来做人脸渐变。

先看看效果图:

。。。。。。。。。。。。。。。。。。。。。。。。

简单介绍一下过程(我用的是matlab实现,因为matlab自带的函数还有矩阵运算实在太强大了,让我省掉好多功夫,可能以后还会用c++写一遍):

1、分别在原图和目的图上面标注特征点,并且把所有点的坐标记录下来,例如:

(说白了做的主要是五官的渐变,把五官用特征点标出来,当然可以用人脸识别的方法代替我手工标记。。。但知识和时间有限没有实现识别的代码,只能手动操作,以后补上)

2、有了所有这些特征点之后做三角剖分:(后面步骤介绍其作用)

就是每三个点画成一个三角形,互不相交的,得到的就是这样子:

(matlab有自带三角剖分的函数,delaunay,用法百度一下一堆)

3、求出当前所要画的中间过程图的每个点的像素值: 其实要画出中间过程图的是怎么做的呢?就是画出每个像素点的像素值!那我怎么知道像素值是多少,那当然是原图和目标图上对应点的像素值的加权平均啊,取系数不同就可以画出不同的中间过程。说白了我要找到原图和目标图上对应像素点读取像素值,首先我就要找到对应像素点的坐标!

所以我们引入三角剖分,目的就是找出对应点的坐标,用一个例子来说明:

假设ABC是原图上的三角形,A'B'C'是我变换过程中图上对应的三角形

我们将左边的点弄成齐次矩阵,即:A的坐标矩阵就是[x; y; 1](注意这是3*1的),BC同理,ABC就是一个3*3的矩阵[A,B,C],然后我们定义一个3*3的M矩阵,M*ABC = A‘B'C';然后就有M = A‘B’C'*inv(ABC),inv是求逆。

这个矩阵可以推广到所有点,所以我们要找对应点的位置,就可以用该点的坐标,左乘inv(M),就得到原图上对应点的坐标啦!再读取一下像素值,这样就OK啦!

这里还有一个小技巧,做双线性插值,效果会比较好,但是我的图才几百乘几百差不了多少,所以我没做。

4、将所有点的像素值输出到图像上,matlab的imwrite,大功告成。。。

展示一下我做了几个效果图:

me to Harden:

me to Leon:

matlab代码:

clear all close all

%原图~目标图

%图片读入到矩阵

originG = imread('%图片地址');

targetG = imread('');

%图片特征点,我是存到txt里面然后读取

originT = load('%txt文件地址');

targetT = load('');

num = size(originT, 1);

%三角剖分

TRI = delaunay(originT(: , 1), originT(: , 2));

%中间图的特征点

medT = zeros(num, 2);

P = 0.1 : 0.1 : 0.9;

for j = 1: 9

%求出中间图特征点位置

for i = 1: num

medT(i, 1) = P(j)*(targetT(i, 1) - originT(i, 1)) + originT(i, 1);

medT(i, 2) = P(j)*(targetT(i, 2) - originT(i, 2)) + originT(i, 2);

end

%先弄一个全零矩阵,用来存中间图每个像素点像素值

medG = zeros(300, 200, 3);

for x = 1: 300

for y = 1: 200

for k = 1: size(TRI, 1)

mX = medT(TRI(k, :), 1); %某个三角形3个定点的x值

mY = medT(TRI(k, :), 2);

%判断点是否在三角形内

[IN, ON] = inpolygon(x, y, mX, mY);

if ON == 1 || IN == 1

m0 = [mX, mY, ones(3, 1)]';

m1 = [originT(TRI(k, :), 1), originT(TRI(k, :), 2), ones(3, 1)]'; %向原图转换

tran1 = m1 * m0^-1;

pos1 = tran1 * [x; y; 1];

m2 = [targetT(TRI(k, :), 1), targetT(TRI(k, :), 2), ones(3, 1)]'; %向目标图转换

tran2 = m2 * m0^-1;

pos2 = tran2 * [x; y; 1];

medG(x, y, :) = (1-P(j)) * originG(round(pos1(1,1)), round(pos1(2,1)), :) + P(j) * targetG(round(pos2(1,1)), round(pos2(2,1)), :);

break;

end

end

end

end

%画图

filename = ['%存放地址', num2str(j), '.jpg'];

imwrite(uint8(medG), filename, 'jpg');

end挺详细了,就这样吧!谢谢阅读!

matlab 渐变背景,Image Warping-Morphing 实现人脸渐变相关推荐

  1. android canvas画渐变背景,View绘制系列(13)-Canvas渐变属性绘制

    Canvas渐变属性绘制 五颜六色,七彩缤纷.有时候我们的UI设计稿也极尽色彩之能,比如下图这样: 这种渐变效果我们能画吗?不得不说,Android系统的基础构架还是很强大的,我们可以使用Linear ...

  2. CSS实现兼容性的渐变背景(gradient)效果(转)

    by zhangxinxu from http://www.zhangxinxu.com 本文地址: http://www.zhangxinxu.com/wordpress/?p=743 一.有点俗态 ...

  3. html渐变不兼容,CSS实现兼容性的渐变背景(gradient)效果兼容众多浏览器

    一.有点俗态的开场白 要是两年前,实现"兼容性的渐变效果"这个说法估计不会被提出来的,那个时候,说起渐变背景,想到的多半是IE的渐变滤镜,其他浏览器尚未支持,但是,在对CSS3支持 ...

  4. 【CSS】渐变背景(background-image)

    文章目录 [CSS]渐变背景(background-image) 1.线性渐变 1.1 CSS代码 2.色标 2.1 添加色标 3.IE的支持程度 4. 平铺的线性渐变 5.径向渐变 5.1设置径向渐 ...

  5. 利用Phtoshop去掉图片中的线性渐变背景

    去掉线性渐变背景的思路就是采用颜色叠加. 我们知道在计算机中颜色都是采用RGB表示的,如果一个色素的RGB颜色是(a1,a2,a3),那么在该像素上混合一个(255-a1,255-a2,255-a3) ...

  6. @description iPhoneX炫彩渐变背景实现

    /*** @author zhangxinxu(.com)* @description iPhoneX炫彩渐变背景实现* @link http://www.zhangxinxu.com/wordpre ...

  7. html给背景架渐变,JS和CSS实现渐变背景特效的代码

    这篇文章主要介绍了JS和CSS实现的漂亮渐变背景特效代码,包含6个渐变效果,涉及JavaScript针对页面元素属性动态操作的相关技巧,需要的朋友可以参考下 本文实例讲述了JS+CSS实现的漂亮渐变背 ...

  8. 液态渐变背景纹理,选择一个新潮的背景,为你的设计加分!

    为你的网站或设计项目选择合适的背景纹理是很棘手的. 在哪里找到令人惊叹的图形? 无论你是在寻找在你的设计中使用哪种使用背景纹理,液态渐变背景,都是你的其中一个总要 选择. 都在这里--素材路上 www ...

  9. Woed渐变背景怎么设置?word渐变填充在哪里?

    Word渐变背景怎么设置?Word文档大家都知道吧,用的也比较多,它是办公软件家族的一员,它最常用到的地方就是写文章,很多人写文章都是在这个文档上面写的,word渐变填充在哪里? 说到word渐变填充 ...

最新文章

  1. javascript:为string类添加三个成员,实现去左,右,及所有空格
  2. 在vuejs 中使用axios不能获取属性data的解决方法
  3. 使用nomad部署mysql
  4. video和dvd audio区别:
  5. SAS宏技术中,%let和call symput有什么区别?
  6. SQL SERVER2000教程-第二章-创建和管理数据库 第六节 压缩数据库
  7. linux动态库与静态库混合连接
  8. MYSQL--浅析索引
  9. 标记分布学习与标记增强
  10. Python用20行代码实现一个验证码的输入与验证(完整源码)
  11. 读书笔记_量化交易如何建立自己的算法交易02
  12. 匆忙赶路的时候别忘了适时停下来回头看看
  13. 安装Cnario提示.Net 3.5安装错误, 检查Windows系统更新提示无法检查到更新, 安装.Net 3.5提示Windows无法完成请求的更改, 错误代码:0x800F081F...
  14. 阿里云Maven仓库
  15. centos 安装wget命令
  16. 计算机技术与高中英语教学整合,计算机技术与高中英语课程整合的探讨(多媒体英语教学系列论文十篇).doc...
  17. 初见安~这里是樱狸的博客目录~
  18. hourglass网络详解+pytorch代码
  19. 保险初识经验汇总(重疾、医疗、寿险、意外)
  20. 【Reinforcement Learning】蒙特卡洛算法

热门文章

  1. 电脑管家让电脑性能直线下降的可能原因
  2. MWeb入门-MWeb mac外部模式详细介绍
  3. 工业智能网关BL110应用之十二:如何联网登录配置软件以及添加LAN口设备要采集的数据点
  4. 【预览pdf】:uniapp在微信小程序预览pdf,兼容安卓/IOS
  5. 空间平面方程 java,【数学】 三维空间中圆的方程
  6. Office破解excel的代码不适用于WPS
  7. IP地址转换为16进制输出
  8. 神经网络是用来干什么的,神经网络是干什么用的
  9. php能写入英文不能写入中文,ios,uitextfield_IOS textField怎样设置只能输入英文字母或者数字,不能输入汉字,ios,uitextfield - phpStudy...
  10. 锻炼专注能力表格使用记录