-1

我正在尝试解决与图像处理相关的问题,但似乎我一直坚持选择合适的算法。也许你们中的某个人可以帮助我并说出我对问题的推理中的问题所在。

假设我们有两个 16x16 像素的图像。作为用户,我在这张图片上选择了两个点。作为用户,我知道点 x1(8,8) 和 y1(10,10) 与第二张图像中的点相同,比如说 x2(5,5) 和 y2(8,8)。

所以这两个点对我来说是某种向量。所以假设我可以计算这个向量的长度。

我想达到什么目的?我想移动第一张图像上的点,与第二张图像上的点相关。

我的“新”点 X 应该在点 x1 和 x2 之间(在中间),而我的“新”Y 点应该在点 y1 和 y2 之间。

当然,很容易将 (x1,y1) 像素的值移动到 (px1,px2) 像素,但是我该怎么处理剩下的呢?我的意思是我需要对所有图像进行变形/变形或其他任何操作。

我卡住了。我正在研究变形算法、变形算法、最近邻算法,但它们对我来说没用,或者我不明白如何正确使用它们。

我相信你不会否定我的问题。我真的需要线索才能继续前进。我不需要在代码中实现,我只需要了解我对问题缺乏了解的地方以及我如何以不同的方式思考它。提前致谢

[编辑]

我试图从这里理解图像变形算法。你能帮我理解到底是什么吗

u = [ (X-P)(Q-P) ]/ ||Q-P||
v = [ (X-P) * Perpendicular(Q-P) ] / ||Q-P||

如果我理解正确,||QP|| 应该是点 Q 和 P 之间的长度。那么 (XP) 或 (QP) 是什么?我如何计算垂直(QP)?它应该是线方程,还是长度?

4

1 回答 1

1

您正在寻找的技术是具有 2 个控制点的“仿射变换” 。

所以,我使用ImageMagick,它安装在大多数 Linux 发行版上,也可用于 macOS 和 Windows。我只是在命令行的终端中执行此操作。

让我们制作一个起始图像 - 我已将您所有的数字放大了 10 倍,使其大到可以看到:

convert -size 160x160 gradient:cyan-magenta \
   -fill black -draw "line 0,0 160,160"     \
   -fill yellow -draw "line 160,0 0,160"    \
   -fill red -draw "circle 80,80 80,85" -draw "circle 100,100 100,105" start.png

在此处输入图像描述

红色圆圈是您的起点。然后我应用仿射变换,将 [80,80] 转换为 [100,100] 并将 [50,50] 转换为 [80,80]:

convert start.png -distort affine '80,80 50,50 100,100 80,80' distorted.png

在此处输入图像描述

于 2017-01-26T21:19:52.737 回答