我想在更大的图像中计算星星的角点或轮廓。为此,我将尺寸缩小到较小的尺寸和尺寸。我能清楚地明白这一点。现在如何在原始图像中映射这一点?我正在使用opencv c ++。
答案 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
您应该能够自己找出w
和h
的值,并且能够轻松地映射坐标。当然,由于四舍五入,您将无法计算原始图像中的精确坐标。
答案 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)