Для начала я в основном пытаюсь go из этого:
К этому:
Учитывая, что каждая координата [x, y] соответствует заданной точке на втором изображении после применения функции к x и y. f (x, y) = координаты второго изображения для значения [x, y]. На данный момент я обрабатываю эту часть, чтобы создать массив «map» из x и y и поиск в этом массиве, чтобы найти новую точку. поэтому mapArrayX [x] даст новое значение x, а mapArray [y] даст новое значение Y. Проблема с этим заключается в том, что мне приходится перебирать все изображение (256 000 точек), и это занимает примерно 0,4 секунды. Есть ли лучший способ сделать это?
Вторая проблема - после преобразования координат, я получаю изображение с отверстиями в нем, которое выглядит так:
, который я делаю похожим на изображение выше без дырок, выполняя это:
dewarpedImage[dewarpedImage == 0] = np.nan
x = np.arange(0, dewarpedImage.shape[1])
y = np.arange(0, dewarpedImage.shape[0])
# mask invalid values
dewarpedImage = np.ma.masked_invalid(dewarpedImage)
xx, yy = np.meshgrid(x, y)
# get only the valid values
x1 = xx[~dewarpedImage.mask]
y1 = yy[~dewarpedImage.mask]
newarr = dewarpedImage[~dewarpedImage.mask]
startTime = time.time()
dewarpedImage = interpolate.griddata((x1, y1), newarr.ravel(),
(xx, yy),
method='linear')
Это займет примерно 3 секунды. Может быть, есть более быстрый способ сделать это? В идеале мне нужно, чтобы весь этот процесс достиг go от 3 + секунд до менее 1 секунды.
Вот моя функция преобразования / как я генерирую свое отображение:
RANGE_BIN_SIZE = .39
def rangeBinToRange(rangeBin):
return rangeBin * RANGE_BIN_SIZE
def azToDegree(azBin):
degree = math.degrees(math.asin((azBin - 127.5) * 0.3771/(0.19812*255)))
return degree
def makeWarpMap():
print("making warp maps")
xMap = np.zeros((1024, 256))
yMap = np.zeros((1024, 256))
for az in range(256):
for rang in range(1024):
azDegree = azToDegree(az)
dist = rangeBinToRange(rang)
x = round(dist * math.sin(math.radians(azDegree)) + 381)
y = round(dist * math.cos(math.radians(azDegree)))
xMap[rang][az] = x
yMap[rang][az] = y
np.save("warpmapX", xMap)
np.save("warpmapY", yMap)
print(azToDegree(0))
if not path.exists("warpmapX.npy") or not path.exists("warpmapY.npy"):
makeWarpMap()
data = np.load(filename)
xMap = np.load("warpmapX.npy")
yMap = np.load("warpmapY.npy")
dewarpedImage = np.zeros((400, 762))
print(data.shape)
for az in range(256):
azslice = data[:, az]
for rang in range(1024):
intensity = azslice[rang]
x = xMap[rang][az]
y = yMap[rang][az]
dewarpedImage[int(y)][int(x)] = intensity