Logi c за интерполяцией ближайшего соседа - PullRequest
1 голос
/ 19 января 2020

У меня есть уполномоченный, где мне нужно заново создать функцию интерполяции ближайшего соседа с нуля в python. Я только начал язык несколько дней go, поэтому я пытаюсь написать все маленькие шаги, чтобы достичь этого.

Это моя первая попытка решить его :) Причины этого (например, для данного изображения и масштаба 0,5) для масштабирования позиций X и Y исходного изображения до X 'и Y' следующим образом:

Форма данного изображения: 10x10. Я хочу увеличить его до 5x5 (это уменьшение масштаба)

X и Y перед масштабированием

X = [0,1, 2,3,4,5,6,7,8,9] Y = [0,1,2,3,4,5,6,7,8,9]

X и Y позиции после масштабирования

X '= [0,2.25,4.5,6.75,9] Y' = [0,2.25,4.5,6.75,9]

округлено

X '= [0,2,5,7,9] Y' = [0,2,5,7,9]

Затем я смотрю в пиксели из исходного изображения с использованием этих позиций

Я не знаю, имеет ли это смысл или я что-то упускаю

Мой код (способ, которым я назвал свои переменные, не так отлично)

def interpolation_nn(image, scale):

    # saving the type of the image
    dtype = image.dtype

    #Adding padding to the image
    img_p = np.pad(image.astype(np.float32), 1)

    # Calculation of the size of the original image and of the interpolated image
    #Original img
    height,width = image.shape 

    #interpolated image
    Scaled_width = (width * scale)
    Scaled_height = (height * scale)

    # Calculation of pixel coordinates in the interpolated image
    Scaled_X_coordinates=np.linspace(0.0, width, num=Scaled_width)
    Scaled_Y_coordinates=np.linspace(0.0, height, num=Scaled_height)

    #rounding my positions
    Scaled_X_coordinates=np.around(Scaled_X_coordinates)
    Scaled_Y_coordinates=np.around(Scaled_Y_coordinates)

    #edited
    finalMatrix= np.zeros(shape=(np.around(Scaled_height).astype(int) ,np.around(Scaled_width).astype(int)))
    pixels=[]

    #Here, i store every pixels from the original image using the scaled coordinates
    #into an array of pixels
    for Line in Scaled_Y_coordinates.astype(int)  :
        for Column in Scaled_X_coordinates.astype(int):
            pixel = img_p[Line,Column]
            pixels.append(pixel)

    #Here i reconstruct the scaled image using the array of pixels from above
    Pixel_counter=0
    for i in range(np.around(Scaled_height).astype(int)):
        for j in range(np.around(Scaled_width).astype(int)):
            finalMatrix[i][j]=pixels[Pixel_counter]
            Pixel_counter=Pixel_counter+1

    #returning a new matrix with the same type as the given img
    return finalMatrix.astype(dtype)

Я понятия не имею, как посмотреть в пиксели исходного изображения, чтобы воссоздать новое с новыми масштабированными позициями. Если что-то неясно, спросите:)

1 Ответ

0 голосов
/ 19 января 2020

Если вы все сделали правильно в своих вычислениях, то недостающий фрагмент так же прост:

for a in X_corresponding :
    column = [image[a,b] for b in Y_corresponding]
    finalMatrix.append( column )

Вот готовое решение:

def nn_interpolate(A, new_size):
    """Vectorized Nearest Neighbor Interpolation"""

    old_size = A.shape
    row_ratio, col_ratio = np.array(new_size)/np.array(old_size)

    # row wise interpolation 
    row_idx = (np.ceil(range(1, 1 + int(old_size[0]*row_ratio))/row_ratio) - 1).astype(int)

    # column wise interpolation
    col_idx = (np.ceil(range(1, 1 + int(old_size[1]*col_ratio))/col_ratio) - 1).astype(int)

    final_matrix = A[:, row_idx][col_idx, :]

return final_matrix

или если вам нужна более подробная информация, вот URL, откуда я ее взял: https://gist.github.com/KeremTurgutlu/68feb119c9dd148285be2e247267a203

...