Изменение размера изображения, IndexError: индекс назначения списка вне диапазона - PullRequest
0 голосов
/ 13 ноября 2018

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

Мой код можно увидеть ниже

import cv2 as cv

img = cv.imread('Scale.jpg', 1)
cv.imshow('unscaled', img)
h,w = img.shape[:2]
print(h)
print(w)
def resizePixels(pixels,w1,h1,w2,h2) :

   retval = [w2,h2]
   # EDIT: added +1 to remedy an early rounding problem
   x_ratio = (int)((w1<<16)/w2) +1
   y_ratio = (int)((h1<<16)/h2) +1
   #int x_ratio = (int)((w1<<16)/w2)
   #int y_ratio = (int)((h1<<16)/h2)
   #two = int(x2,y2)
   for i in range (h2):
     i += 1
    for j in range(w2):
        j += 1
        x2 = ((j*x_ratio)>>16)
        y2 = ((i*y_ratio)>>16)
        retval[(i*w2)+j] = pixels[(y2*w1)+x2]

   return retval;

dst = resizePixels(img,h,w,300,300)

#cv.imshow('Resize',dst)
cv.waitKey(0)

РЕДАКТИРОВАТЬ: Это Traceback я получаю

Traceback (most recent call last):
File "C:/Users/Asus/PycharmProjects/Scaling/Scaling.py", line 27, in 
<module>
dst = resizePixels(img,h,w,300,300)

File "C:/Users/Asus/PycharmProjects/Scaling/Scaling.py", line 23, in 
resizePixels

retval[(i*w2)+j] = pixels[(y2*w1)+x2]
IndexError: list assignment index out of range

Изображение, которое я использую для масштабирования

1 Ответ

0 голосов
/ 14 ноября 2018

Я делаю небольшие изменения в вашем коде, и это работает.Прочитайте мой комментарий в коде для более подробной информации.

import cv2 
import numpy as np

img = cv2.imread('1.png', 0)
cv2.imshow('unscaled', img)

h,w = img.shape[:2]
print(h)
print(w)
def resizePixels(pixels,w1,h1,w2,h2):
    retval = []
    # EDIT: added +1 to remedy an early rounding problem
    x_ratio = (int)((w1<<16)/w2) +1
    print(x_ratio)
    y_ratio = (int)((h1<<16)/h2) +1
    print(y_ratio)
    #int x_ratio = (int)((w1<<16)/w2)
    #int y_ratio = (int)((h1<<16)/h2)
    #two = int(x2,y2)
    for i in range(h2):
        # no need to have this: i += 1
        for j in range(w2):
            # no need to have this too: j += 1
            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,300,300)
# reshape the array to get the resize image
dst = np.reshape(ret,(300,300))

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

enter image description here

...