Мне удалось создать два разных кода, один из них из другого поста о переполнении стека, который масштабирует изображение без использования каких-либо функций 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()
Надеюсь, можно преобразовать мой текущий код в версию, которая использует прямое отображение, если нет, у меня нет проблем с созданием нового кода.