【问题标题】:Affine transformation implementation仿射变换实现
【发布时间】:2013-03-11 19:19:43
【问题描述】:

我正在尝试对两个图像进行仿射变换。 首先,我在两个图像中找到匹配对。其中一个是缩放图像,另一个是参考图像。这些对返回给我的系数为:

     |1   0 |      | x |       |  1  |
A  = |      |  X = |   |   B = |     |
     |0   0 |      | y |       | 221 |   

The equation formed is X' = AX + B;

x_co_efficients[2] = (((x_new_Cordinate[2]-x_new_Cordinate[0])*(xCordinate[1]- xCordinate[0])) - ((x_new_Cordinate[1]-x_new_Cordinate[0])*(xCordinate[2] - xCordinate[0])))/
    (((xCordinate[1]-xCordinate[0])*(yCordinate[2]-yCordinate[0])) - ((xCordinate[2]-xCordinate[0])*(yCordinate[1]-yCordinate[0])));

x_co_efficients[1] = ((x_new_Cordinate[1]-x_new_Cordinate[0]) - (yCordinate[1]-yCordinate[0])*(x_co_efficients[2]))/(xCordinate[1]-xCordinate[0]);

x_co_efficients[0] = x_new_Cordinate[0] - (((x_co_efficients[1])*(xCordinate[0])) + ((x_co_efficients[2])*(yCordinate[0])));



y_co_efficients[2] = (((y_new_Cordinate[2]-y_new_Cordinate[0])*(xCordinate[1]- xCordinate[0])) - ((y_new_Cordinate[1]-y_new_Cordinate[0])*(xCordinate[2] - xCordinate[0])))/
    (((xCordinate[1]-xCordinate[0])*(yCordinate[2]-yCordinate[0])) - ((xCordinate[2]-xCordinate[0])*(yCordinate[1]-yCordinate[0])));

y_co_efficients[1] = ((y_new_Cordinate[1]-y_new_Cordinate[0]) - (yCordinate[1]-yCordinate[0])*(y_co_efficients[2]))/(xCordinate[1]-xCordinate[0]);

y_co_efficients[0] = y_new_Cordinate[0] - (((y_co_efficients[1])*(xCordinate[0])) + ((y_co_efficients[2])*(yCordinate[0])));

这些是我用来确定使用匹配对的系数的方程。这些方程对于相同的图像工作正常,对于缩放图像,它给了我那些系数。现在的问题是我有一个 24 位二进制图像,我想在该图像上实现关于参考的仿射变换。现在,当我尝试找到该图像的新坐标并将其当前值更改为该坐标时,我得到了一个非常失真的图像。如果转换正确,则不应该得到其他结果。 有人可以看看方程式,并解释一下如何在第二张图像上实现这些方程式。 我的代码是 C++。谢谢你。

我的参考图片在上面..我的比较图片是

我得到的结果是只有线条的扭曲图像。

编辑 1

我现在已将求解方法更改为矩阵。现在我得到了正确的输出,但是注册后我得到的图像是这样的.. 此外,我必须在新坐标中应用 0 到 320*240 的限制才能获得像素值。现在我的结果有点像这样。

编辑 2

我已经更改了代码,并且得到了没有任何黑色像素的结果。我有点倾斜..虽然已经删除了给定图像中的缩放效果。

【问题讨论】:

    标签: c++ visual-studio-2010 mfc affinetransform


    【解决方案1】:

    您的转换矩阵 A 有问题。它破坏了y坐标值并将221分配给所有y坐标

    你可以把A中(2,2)处的元素设为1,问题就解决了。

    【讨论】:

    • 我尝试将其设为 1,但它并没有解决问题.. 我对它进行了一些改进.. 编辑上述问题请看一下。谢谢
    • 这些黑线源于转换缺陷。当您的原始图像点映射到输出图像时,它们没有一对一的关系,您可以通过反向插值来处理这个问题。我的意思是,在输出图像中,您获取空像素的坐标,应用反向变换并在原始图像中找到相应的坐标,然后将该像素分配给输出像素
    • 嗨..请查看我的编辑..我现在有点倾斜..你能在这里指导我吗..谢谢
    • 在反向插值过程中,当你找到原始像素值时,你会得到浮点数,而不是直接将它们转换为整数,你可以将它们四舍五入到最接近的整数,你会得到更准确的像素。
    • 它有什么功能吗..?
    猜你喜欢
    • 2010-12-17
    • 2017-05-10
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多