使用numpy.resize调整图像数据失效,如何正确实现图像缩放?
问题原因
np.resize()根本不是用来做图像缩放的工具,它的逻辑是重新调整数组形状,多余元素截断、缺的元素重复原数组填充,完全不考虑图像的空间结构。你原本的图像是(834,1102),缩到(417,551)时,它只是把原数组的像素按顺序重新排列成新形状,自然会把飞机的像素彻底打乱,导致图像失真。
正确的解决方法
既然已经在用PIL,直接用PIL自带的Image.resize()就好,它会用插值算法(默认双线性插值)来保留图像内容,生成符合预期的低分辨率版本:
from PIL import Image # 读取为灰度图 image = Image.open(input_image).convert("L") # 缩放,注意PIL的resize参数是(width, height),和numpy的shape(height, width)相反 resized_image = image.resize((551, 417)) resized_image.save("test.jpeg")
如果一定要用numpy配合插值操作,可以用OpenCV或者scikit-image的工具,比如用OpenCV的示例:
import cv2 import numpy as np # 读取灰度图 arr = cv2.imread(input_image, cv2.IMREAD_GRAYSCALE) # 用双线性插值缩放,dsize参数是(width, height) resized_arr = cv2.resize(arr, (551, 417), interpolation=cv2.INTER_LINEAR) # 保存图像 cv2.imwrite("test.jpeg", resized_arr)
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

