Python, прямое отображение с изменением размера изображения - PullRequest
0 голосов
/ 15 ноября 2018

Мне удалось создать два разных кода, один из них из другого поста о переполнении стека, который масштабирует изображение без использования каких-либо функций openCV, таких как resize, которые используют обратное отображение, но я не могу преобразовать коды в прямое отображение, что приведет к масштабированному изображению с черным «узором» пикселей. Если вы сомневаетесь в том, что прямое / обратное сопоставление является ссылкой, можно найти объяснение здесь

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

Изображение U используется

Приведенный ниже код является рабочим кодом масштабирования, а не кодом, в котором я пытался перенаправить отображение, если необходимо, я также могу опубликовать это.

Код

import cv2 as cv
import numpy as np

img = cv.imread('Scale.jpg')

def upScaling(image, scale):
    (h, w, dim) = img.shape
    scaleH = h * scale
    scaleW = w * scale
    #making sure that the scale factor is an integer
    sH = int(scaleH)
    sW = int(scaleW)
    # Get the ratio of the rows
    row_ratio = h / scaleH
    # Getting the ratio of the cols
    column_ratio = w / scaleW
    # i get a list position of the rows
    row_position = np.floor(np.arange(sH) * row_ratio).astype(int)
    #getting a list of position of the columns
    column_position = np.floor(np.arange(sW) * column_ratio).astype(int)
    # Initialize The scaled image called imageScaled
    scaledUp = np.zeros((sH, sW, 3), np.uint8)
    for i in range(sH):
        for j in range(sW):

        scaledUp[i, j] = img[row_position[i], column_position[j]]

    return scaledUp
ScalingUp = upScaling(img, 1.3)
cv.imshow('Scaling up', ScalingUp)

Код # 2 :

    import cv2

    import numpy as np

    img = cv2.imread('Scale.jpg', 0)

    cv2.imshow('unscaled', img)

    h,w = img.shape[:2]

    print(h)

    print(w)

    def resizePixels(pixels,w1,h1,w2,h2):
        retval = []
        x_ratio = (int)((w1<<16)/w2) +1
        print(x_ratio)
        y_ratio = (int)((h1<<16)/h2) +1
        print(y_ratio)
        for i in range(h2):
            for j in range(w2):
                x2 = ((j*x_ratio)>>16)
                y2 = ((i*y_ratio)>>16)
            #add pixel values from original image to an array
            retval.append(pixels[y2,x2])
        return retval;

    ret = resizePixels(img,w,h,500,500)
    #reshape the array to get the resize image
    dst = np.reshape(ret,(500,500))

    cv2.imshow('Resize',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Надеюсь, можно преобразовать мой текущий код в версию, которая использует прямое отображение, если нет, у меня нет проблем с созданием нового кода.

...