在不使用resize的情况下在python中调整图像大小-最近的邻居

问题描述

对于一项分配,我想使用python代码调整.jpg图像的大小,但不使用PIL.Image.resize()函数或其他类似函数。我想自己编写代码,但不知道如何写。图像是RGB。我发现这可以通过最近邻插值法(以及其他方法解决),但是这对于我的具体分配来说是很好的。高度和宽度都应该可以做得更大或更小。到目前为止,我只有这个:

import numpy as np
import scipy as sc
import matplotlib as plt
import math
import PIL
from PIL import Image

img = np.array(Image.open("foto1.jpg"))          

height = img.shape[0]
width = img.shape[1]
dim = img.shape[2]  

new_h = int(input("New height: "))  
new_w = int(input("New width: "))  

imgR = img[:,:,0] #red pixels
imgG = img[:,1] #green pixels
imgB = img[:,2] #blue pixels

newR = np.empty([new_h,new_w])             
newG = np.empty([new_h,new_w])            
newB = np.empty([new_h,new_w]) 

因此,现在所有三种颜色都具有正确尺寸的新阵列。不幸的是,在网上我只能找到使用resize()函数的人……有人知道吗?

提前谢谢!

解决方法

进行任何图像转换(如调整大小)的关键是要具有从输出坐标到输入坐标的映射。然后,您可以简单地遍历整个输出并从输入中获取一个像素。最近的邻居使这特别容易,因为不需要插值不完全位于整数坐标上的像素-您只需将坐标舍入到最接近的整数即可。

for new_y in range(new_h):
    old_y = int(round(new_y * (new_h - 1) / (height - 1)))
    if old_y < 0: old_y = 0
    if old_y >= height: old_y = height - 1
    for new_x in range(new_w):
        old_x = int(round(new_x * (new_w - 1) / (width - 1)))
        if old_x < 0: old_x = 0
        if old_x >= width: old_x = width - 1
        newR[new_y,new_x] = imgR[old_y,old_x]
        newG[new_y,new_x] = imgG[old_y,old_x]
        newB[new_y,new_x] = imgB[old_y,old_x]