背景:我试图将一张脸变成另一张不同形状的脸.

为了将一个图像扭曲成另一个图像,我使用面部地标的delaunay三角剖分并将一个肖像的三角形扭曲到第二个肖像的相应三角形.我正在使用重心坐标系将三角形内的一个点映射到另一个三角形上相应的扭曲位置.

我的第一种方法是用逆乘法求解系统Ax = b,其中A由三角形的三个角组成,b代表当前点,x代表该点的重心坐标(alpha,beta和gamma) ).我发现每个三角形一次矩阵A的倒数,然后对于该三角形中的每个点,通过找到A ^ -1和点b的点积来计算重心坐标.我发现这很慢(该功能需要36秒才能完成).

根据其他帖子的建议,我尝试使用最小二乘解决方案来提高此过程的效率.但是,当我使用numpy的lsq方法时,时间增加到154秒.我相信这是因为A矩阵在内部循环每次运行时都被考虑在内,而在此之前我能够在两个循环开始之前只找到一次逆.

我的问题是,如何提高这个功能的效率?有没有办法存储A的因子分解,以便每次为新点计算最小二乘解,它不会重复相同的工作?

该函数的伪代码:

# Iterate through each triangle (and get corresponding warp triangle)

for triangle in triangulation:

# Extract corners of the unwarped triangle

a = firstCornerUW

b = secondCornerUW

c = thirdCornerUW

# Extract corners of the warp triangle

a_prime = firstCornerW

b_prime = secondCornerW

c_prime = thirdCornerW

# This matrix will be the same for all points within the triangle

triMatrix = matrix of a, b, and c

# Bounding box of the triangle

xleft = min(ax, bx, cx)

xright = max(ax, bx, cx)

ytop = min(ay, by, cy)

ybottom = max(ay, by, cy)

for x in range(xleft, xright):

for y in range(ytop, ybottom):

# Store the current point as a matrix

p = np.array([[x], [y], [1]])

# Solve for least squares solution to get barycentric coordinates

barycoor = np.linalg.lstsq(triMatrix, p)

# Pull individual coordinates from the array

alpha = barycoor[0]

beta = barycoor[1]

gamma = barycoor[2]

# If any of these conditions are not met, the point is not inside the triangle

if alpha, beta, gamma > 0 and alpha + beta + gamma <= 1:

# Now calculate the warped point by multiplying by alpha, beta, and gamma

# Warp the point from image to warped image

python效率计算-提高python中重心坐标计算的效率相关推荐

  1. python效率计算公式_提高python中重心坐标计算的效率

    背景:我试图将一张脸变成另一张不同形状的脸. 为了将一个图像扭曲成另一个图像,我使用面部地标的delaunay三角剖分并将一个肖像的三角形扭曲到第二个肖像的相应三角形.我正在使用重心坐标系将三角形内的 ...

  2. python运行慢-提高python运行速度的几个技巧

    使用内置数据类型 内置数据类型非常快,尤其是与我们自定义的类型相比. 这主要是因为内置的数据类型是由 C 实现的,而在 Python 中写的代码运行速度实在无法与之相比. 尽量使用内置函数,去掉属性访 ...

  3. python运行软件-提高Python程序的运行速度

    尝试了一下用Python实现的K-Means Clustering算法,抽样了10000篇百科词条,分为1000个类,分词后词语总数为130000左右.如果把1000个类定义为1000个向量,每个向量 ...

  4. java 验证时间格式 效率_有关Java中日期格式化的效率实录

    java中格式化日期为固定格式的字符串,无外乎有两种方法:DateFormat 和String.format(JDK1.5+) 但是哪个方法效率更高呢?本人做了一个实验,发现了一个很有趣的现象. 当系 ...

  5. mysql varchar 效率_由MySQL中char和varchar效率想到的

    对比char和varchar随便在google或百度中搜一下得到的结论大概都是"char定长,varchar不定长,char要比varchar占用更多的空间,由于定长char的效率高于var ...

  6. 边缘计算中的计算迁移概述

    文章目录 前言 一.计算迁移简介 1.1 何为计算迁移? 1.2 计算迁移的一般模型 二.计算迁移的发展 2.1 分布式计算 2.2 普适计算 2.3 云计算 2.4 边缘计算 2.5 边缘计算中的计 ...

  7. 如何提高Python计算浮点数的精度(如何解决Python中浮点数计算误差问题)

    我们可以使用decimal模块来提高python中浮点数计算的精度: 1. 导入decimal模块:import decimal 2. 创建一个Decimal对象:a = decimal.Decima ...

  8. python统计列表中元素个数_python中计算一个列表中连续相同的元素个数方法

    python中计算一个列表中连续相同的元素个数方法 最简单的例子: a = [1,1,1,1,2,2,2,3,3,1,1,1,3] # 问:计算a中最多有几个连续的1 很明显,答案是4 如果用代码实现 ...

  9. python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数返回浮点数

    python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点 ...

最新文章

  1. BCH测试网上出现第一个UTXO证明
  2. a标签被选择的底色_实施特殊管理,婴配乳粉标签书写有规矩(下)
  3. ai模仿声音软件_如何开发人工智能类的软件?人工智能让我们的生活更加便捷!...
  4. coddenomicon工具
  5. 基于MTCNN+CNN的疲劳检测
  6. 210所高校21届保研率曝光!这些211保研率堪比985!
  7. Partitioning big graph with respect to arbitrary proportions in a streaming manner 菜鸟解读
  8. 苹果服务器维护2017.12,2017年12月28日维护公告
  9. 如何出一道计算机仿真题,计算机仿真试题
  10. win10计算机本地组策略编辑器,win10本地组策略编辑器找不到怎么办_win10电脑没有gpedit.msc的解决办法...
  11. java常用设计模式11—适配器模式
  12. Qt项目-------掌上银行(客户端)
  13. Ruoyi框架学习--Vue前端配置文件详解
  14. PTA L2-003 月饼
  15. 【JZOJ6150】爱乐之城
  16. PHP-简单理解递归
  17. 2014 acm亚洲区域赛(北京)总结
  18. golang语言并发与并行——goroutine和channel的详细理解
  19. ubuntu小知识点--常用命令以及操作
  20. IEEE RAL投初稿

热门文章

  1. Java实现批量打包文件Zip下载(适用于Windows,Linux)
  2. Springboot + elementUI实现上传用户头像
  3. 计算机网络:常见的计网面试题整理(一)
  4. 让你的导图不一样的XMind7信息功能卡
  5. Ionic - API
  6. ac自动机 匹配最长前缀_AC自动机算法
  7. 智慧新零售时代 让数字化赋能会员营销
  8. R如何用ggplot画图
  9. windows自带截屏快捷键
  10. html中透明度100是,CSS 透明度设置方法及常见问题解析