如何在按比例缩小的图像中找到等效点?

时间:2014-09-05 10:57:10

标签: c++ opencv

我想在更大的图像中计算星星的角点或轮廓。为此,我将尺寸缩小到较小的尺寸和尺寸。我能清楚地明白这一点。现在如何在原始图像中映射这一点?我正在使用opencv c ++。 enter image description here

2 个答案:

答案 0 :(得分:4)

考虑一个简单的例子:图像尺寸减少了一半。

因此,原始图像中的笛卡尔坐标(x,y)变为缩小图像中的坐标(x / 2,y / 2),缩小图像中的坐标(x',y')对应于原始图像中的坐标(x * 2,y * 2)。

当然,在缩小比例的图像中,小数坐标通常会四舍五入,因此精确的映射仅适用于此示例的原始图像中的偶数坐标。

对此进行概括,如果图像的宽度水平w和垂直h,则坐标(x,y)变为坐标(x * w,y * h) ),四舍五入。在我给出的例子中,w和h都是1/2或.5

您应该能够自己找出wh的值,并且能够轻松地映射坐标。当然,由于四舍五入,您将无法计算原始图像中的精确坐标。

答案 1 :(得分:0)

我意识到这是一个老问题。我只是想在上述Sam的回答中加上一些内容,以解决“ 四舍五入”的情况,以防其他读者想知道我面临的同一件事。

对于四角坐标轴上的偶数像素,此舍入变得很明显。例如,沿着一维轴,将划定第二四分位数的点映射到一个不准确的值:

axis_prev = [0, 1, 2, 3]
axis_new = [0, 1, 2, 3, 4, 5, 6, 7]

w_prev = len(axis_prev) # This is an axis of length 4
w_new = len(axis_new) # This is an axis of length 8

x_prev = 2
x_new = x_prev * w_new / w_prev

print(x_new)
>>> 4
### x_new should be 5

在Python中,一种策略是将值从一个轴分辨率线性内插到另一个轴分辨率。如此说来,我们希望将一个点从较小的图像映射到较大图像中恒星的对应点:

import numpy as np
from scipy.interpolate import interp1d

x_old = np.linspace(0, 640, 641)
x_new = np.linspace(0, 768, 769)

f = interp1d(x_old, x_new)

x = 35
x_prime = f(x)