问题描述
对于一项分配,我想使用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]