发布逆二维矩阵
Issue inverting 2D matrix
本文关键字:布逆二 更新时间:2023-10-16
我正在一个类中的函数来存储图像。这个函数的目的是使用2D矩阵执行线性变换(我不打算支持转换)。我想要做的是测试转换原始图像的角的坐标,并使用极值来计算最终转换图像的必要尺寸。
首先,我有一张新图像,我想循环遍历新图像中的所有像素,并使用逆变换计算原始图像上新像素应该从哪里获得颜色(使用双线性插值)。
我开始编写下面的函数。它还没有对图像做任何事情。问题是,当我通过变换函数传递一组坐标,然后通过逆函数传递这些新坐标时,我期望得到原始值。然而,我没有得到原来的值。
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;
}
下面是我如何调用函数(一个简单的旋转矩阵)。
img.matrix_transform(cos(angle), -sin(angle), sin(angle), cos(angle));
这是我得到的输出…
0 0
2500 0
0 1655
2500 1655
0 0
1975.95 -722.386
-743.978 629.455
1231.97 -92.9314
我期望顶部的坐标集与底部的坐标集匹配。
这里
x = x * m11 + y * m12;
y = x * m21 + y * m22;
第二个赋值使用已经修改过的x
值。改为
auto newx = x * m11 + y * m12;
y = x * m21 + y * m22;
x = newx;
相关文章:
- 将二维矢量传递给类
- 二叉排序树无法编译
- 在计算中使用二的幂有多有利可图
- 将值从二维数组输出到文本文件
- 从父数组测试用例构造二叉树失败
- 我在二维向量中是否正确分配了内存
- 带结构的二维矢量:如何存储元素
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 使用C++创建特殊的二叉搜索树
- 如何正确填充在堆上分配的二维数组?
- 输出 0 和 -0 的二次公式,与给定的项无关
- 传递二维数组时出现问题
- 打印时有二叉树问题.用户输入不打印任何内容
- 二叉搜索如何比线性搜索更快?
- 具有随机数的二维数组不会更改
- 在递归二叉搜索树中搜索
- 如何在C++中获取二维数组中最少的一列数?
- 发布逆二维矩阵