Наиболее эффективный способ преобразования двумерного массива в другую систему координат с использованием функции, а затем интерполировать получающиеся отверстия - PullRequest
0 голосов
/ 24 апреля 2020

Для начала я в основном пытаюсь go из этого:

enter image description here

К этому:

enter image description here

Учитывая, что каждая координата [x, y] соответствует заданной точке на втором изображении после применения функции к x и y. f (x, y) = координаты второго изображения для значения [x, y]. На данный момент я обрабатываю эту часть, чтобы создать массив «map» из x и y и поиск в этом массиве, чтобы найти новую точку. поэтому mapArrayX [x] даст новое значение x, а mapArray [y] даст новое значение Y. Проблема с этим заключается в том, что мне приходится перебирать все изображение (256 000 точек), и это занимает примерно 0,4 секунды. Есть ли лучший способ сделать это?

Вторая проблема - после преобразования координат, я получаю изображение с отверстиями в нем, которое выглядит так:

enter image description here

, который я делаю похожим на изображение выше без дырок, выполняя это:

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


1 Ответ

1 голос
/ 24 апреля 2020

У вас есть дыры в преобразованном изображении, потому что преобразование не охватывает все полярное изображение. Я бы порекомендовал сделать обратное преобразование. Другими словами, для каждого (X,Y) в полярном изображении найдите соответствующую точку (x,y) в декартовом изображении и получите этот цвет. Таким образом, вам вообще не нужно иметь дело с дырками, и это даст вам полное изображение (избавит от конвертации 3se c). Если вы предоставите свою функцию преобразования, я могу помочь вам сделать обратное преобразование.

...