将笛卡尔坐标转换为极坐标
Converting Cartesian Coordinates To Polar Coordinates
我正在尝试将图像从极坐标转换为笛卡尔坐标,但在应用公式后我得到了浮点坐标(r 和 teta),但我不知道如何表示 space 中的点对 x 和 y 使用浮点数。可能有一种方法可以将它们转换为 int 数字并仍然保留分布,但我不知道该怎么做。我知道 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;
您的实现尝试用极坐标表示给定圆内的每个整数坐标点。但是,通过这种方式,您将以一个坐标数组和一个值来终止。
如果您想对图像进行几何变换,您应该:
- 创建具有适当宽度(
rho
分辨率)和高度(theta
分辨率)的目标图像;
- 遍历目标图像的每个像素并通过逆变换将其映射回原始图像;
- 通过最终插值附近的值,将反向变换点的值获取到原始图像中。
可以使用不同的方法对值进行插值。非详尽列表包括:
我正在尝试将图像从极坐标转换为笛卡尔坐标,但在应用公式后我得到了浮点坐标(r 和 teta),但我不知道如何表示 space 中的点对 x 和 y 使用浮点数。可能有一种方法可以将它们转换为 int 数字并仍然保留分布,但我不知道该怎么做。我知道 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;
您的实现尝试用极坐标表示给定圆内的每个整数坐标点。但是,通过这种方式,您将以一个坐标数组和一个值来终止。
如果您想对图像进行几何变换,您应该:
- 创建具有适当宽度(
rho
分辨率)和高度(theta
分辨率)的目标图像; - 遍历目标图像的每个像素并通过逆变换将其映射回原始图像;
- 通过最终插值附近的值,将反向变换点的值获取到原始图像中。
可以使用不同的方法对值进行插值。非详尽列表包括: