首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二维矩阵的问题反演

二维矩阵的问题反演
EN

Stack Overflow用户
提问于 2015-10-19 15:07:17
回答 1查看 62关注 0票数 1

我正在处理一个类中的函数来存储图像。此函数的目的是使用2D矩阵执行线性转换(我不打算支持转换)。我想要做的方法是测试转换原始图像角的坐标,并使用极值来计算结果转换后的图像的必要大小。

第一,我有新的图像,我想循环所有的像素在新的图像,并使用逆变换,计算,在原始图像上,新的像素应该从哪里得到他们的颜色(使用双线性插值)。

我开始编写以下函数。它还没有对图像做任何事情。问题是,当我通过转换函数传递一组坐标,然后通过反函数传递这些新坐标时,我希望得到原始值。然而,我不会收回原来的价值。

代码语言:javascript
复制
Image Image::matrix_transform(float m11, float m12, float m21, float m22) const
{
    float det = m11 * m22 - m12 * m21;
    img_assert(det, "Matrix not invertible.");

    //inverse matrix values
    float im11 = m22 / det;
    float im22 = m11 / det;
    float im21 = -m21 / det;
    float im12 = -m12 / det;

    //transformation 
    const auto t = [m11, m12, m21, m22](float& x, float& y)
    {
        x = x * m11 + y * m12;
        y = x * m21 + y * m22;
    };

    //inverse
    const auto ti = [im11, im12, im21, im22](float& x, float& y)
    {
        x = x * im11 + y * im12;
        y = x * im21 + y * im22;
    };

    float x00 = 0.0f, y00 = 0.0f;
    float x11 = w, y11 = h;
    float x10 = 0.0f, y10 = h;
    float x01 = w, y01 = 0.0f;

    std::cout << x00 << " " << y00 << std::endl;
    std::cout << x01 << " " << y01 << std::endl;
    std::cout << x10 << " " << y10 << std::endl;
    std::cout << x11 << " " << y11 << std::endl;

    t(x00, y00);
    t(x11, y11);
    t(x10, y10);
    t(x01, y01);

    ti(x00, y00);
    ti(x11, y11);
    ti(x10, y10);
    ti(x01, y01);

    std::cout << x00 << " " << y00 << std::endl;
    std::cout << x01 << " " << y01 << std::endl;
    std::cout << x10 << " " << y10 << std::endl;
    std::cout << x11 << " " << y11 << std::endl;

    return *this;
}

下面是我如何调用这个函数(一个简单的旋转矩阵)。

代码语言:javascript
复制
img.matrix_transform(cos(angle), -sin(angle), sin(angle), cos(angle));

这是我得到的输出。

代码语言:javascript
复制
0 0
2500 0
0 1655
2500 1655


0 0
1975.95 -722.386
-743.978 629.455
1231.97 -92.9314

我以为最上面的一组坐标与底部相匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-19 15:10:31

这里

代码语言:javascript
复制
    x = x * m11 + y * m12;
    y = x * m21 + y * m22;

第二个赋值使用已经修改的x值。把它改成

代码语言:javascript
复制
    auto newx = x * m11 + y * m12;
    y = x * m21 + y * m22;
    x = newx;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33217882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档