当前位置: 首页 > 知识库问答 >
问题:

将笛卡尔坐标转换为极坐标

梅飞龙
2023-03-14

我试图将图像从极坐标转换为笛卡尔坐标,但在应用公式后,我得到了浮点坐标(r和teta),我不知道如何使用x和y的浮点来表示空间中的点。可能有一种方法可以将它们转换为整数,并仍然保留分布,但我不知道如何。我知道OpenCV中有像warpPolar这样的函数,但我想自己实现它。任何想法都会有帮助:)

这是我的代码:

struct Value
{
    double r;
    double teta;
    int value;  // pixel intensity
};
void irisNormalization(Mat img, Circle pupilCircle, Circle irisCircle, int &matrixWidth, int &matrixHeight)
{
    int w = img.size().width;
    int h = img.size().height;
    int X, Y;
    double r, teta;
    int rayOfIris = irisCircle.getRay();
    std::vector<Value> polar;
    // consider the rectangle the iris circle is confined in
    int xstart = irisCircle.getA() - rayOfIris;
    int ystart = irisCircle.getB() - rayOfIris;
    int xfinish = irisCircle.getA() + rayOfIris;
    int yfinish = irisCircle.getB() + rayOfIris;
    for (int x = xstart; x < xfinish; x++)
        for (int y = ystart; y < yfinish; y++)
        {
            X = x - xstart - rayOfIris;
            Y = y - ystart - rayOfIris;
            r = sqrt(X * X + Y * Y);
            if (X != 0)
            {
                teta = (atan(abs(Y / X)) * double(180 / M_PI));
                if (X > 0 && Y > 0) // quadrant 1
                    teta = teta;
                if (X > 0 && Y < 0)
                    teta = 360 - teta; // quadrant 4
                if (X < 0 && Y > 0) // quadrant 2
                    teta = 180 - teta;
                if (X < 0 && Y < 0) // quadrant 3
                    teta = 180 + teta;
                if (r < rayOfIris)
                {
                    polar.push_back({ r, teta, int(((Scalar)(img.at<uchar>(Point(x, y)))).val[0]) });
                }
            }
        }
    std::sort(polar.begin(), polar.end(), [](const Value &left, const Value &right) {
        return left.r < right.r && left.teta < right.teta;
    });
    for (std::vector<Value>::const_iterator i = polar.begin(); i != polar.end(); ++i)
        std::cout << i->r << ' ' << i->teta << endl;

共有1个答案

岳俊晖
2023-03-14

您的实现尝试以极坐标表示给定圆内的每个整数坐标点。但是,通过这种方式,您以一个带有值的坐标数组终止。

如果要对图像进行几何变换,则应:

  • 创建具有适当宽度(rho分辨率)和高度(θ分辨率)的目标图像;
  • 遍历目标图像的每个像素,并通过逆变换将其映射回原始图像;
  • 通过最终插值近值,将反向转换点的值转换为原始图像。

对于插值,可以使用不同的方法。非详尽列表包括:

  • 最近邻插值;
  • 双线性插值;
  • 双三次插值。
 类似资料:
  • 我正在尝试将球坐标转换为笛卡尔坐标,以绘制一个简单的三维金字塔。 下面是获取金字塔四个主要角的代码,具体取决于极角yrad和方位角xrad以及顶点坐标x和y: 方位角轴似乎工作正常,但问题是,在操纵极轴角时,当它们越过天顶或底部时,左右会互换,如图所示(选择顶部的mp4以更平滑地播放):http://gyazo.com/4a245713c232893960863cf4ea4186f6 怎么了?

  • 我正在尝试将极坐标的图像转换为笛卡尔坐标。 将图像转换为极坐标的示例显式执行-想要一个光滑的矩阵方法 我原以为使用上述方法是小菜一碟,但事实并非如此!!如果有人发现我的代码有错误,请告诉我! 我发现非常奇怪的是,当我改变phi时,它会做出根本性的改变,而不是以我期望的方式! 干杯

  • 我想知道是否有人帮助我理解如何将顶部图像转换为底部图像。以下链接中提供了这些图像。顶部图像采用笛卡尔坐标。底部图像是极坐标中的转换图像

  • 我试图对下面的第一幅图像进行极坐标变换,最后得到第二幅。然而,我的结果是第三张图片。我有一种感觉,这与我选择的“原产地”有关,但我不确定。

  • 我知道这个问题已经被回答了很多次,但是我不知道我做的是好是坏。 我得到了一个带有缺陷位置和图像ID的文件。图像大小为96*96。起源是(48,48) 由此计算R和T 然后,我为每个图像创建大小为96×96的空矩阵,对于图像1(例如),我在每个坐标(R,T)处赋值0 当我绘制矩阵时,我的结果很奇怪。。我错过了什么重要的事情吗?

  • 我一直在寻找一种解决方案来转换笛卡尔坐标(lat, long),我必须极坐标以促进我想要运行的模拟,但我在这里没有找到任何问题或答案。有很多选项,包括Matlab中的内置函数cart2pol,但我所有的数据都在R中,我想继续在这个框架中舒适地工作。 问题: 我有来自标记数据的lat/long坐标,我想将这些转换为极坐标(意味着跳跃大小和角度:http://en.wikipedia.org/wiki