无法正确地将数组转换为图像

问题描述 投票:1回答:1

我想从文件中读取一个图像,将其大小调整为方形尺寸(调整大小),然后将数组转换为图像以显示它。所以我为它编写下面的代码,但不幸的是fromarray方法最终没有显示真实的图像..我可以修复它吗? (我不想使用opencv或其他内置函数)

#import the libraries
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import cv2
from PIL import Image
from scipy.misc import toimage

#reading the image
myimage = cv2.imread('mahdi.png')

#plotting the image
cv2.imshow('mahdi',myimage)
cv2.waitKey(0)
cv2.destroyAllWindows()

#save
cv2.imwrite('newmahdi.png',myimage)

#get size of image
dimensions = myimage.shape
height = myimage.shape[0]
width = myimage.shape[1]
print('Image Dimension    : ',dimensions)
print('Image Height       : ',height)
print('Image Width        : ',width,'\n')

#read image and convert to array
myimage1=mpimg.imread('mahdi.png')
imtopix = np.array(myimage1)
print('image to matrix:','\n',imtopix)

#resize image without OPENCV function... use numpy instead
myimage2 =np.resize(imtopix,(200,200))
newimg = Image.fromarray(myimage2)
newimg.save('my.png')
newimg.show()
python numpy matplotlib python-imaging-library cv2
1个回答
0
投票

Numpy的resize()并没有按照你的想法做到。它不会沿着轴重新采样数组。

假设您的源数组如下所示:

array([
        [11, 12, 13, 14, 15],
        [21, 22, 23, 24, 25]
      ])

然后在a = np.resize(a, (3, 3))之后,结果将如下所示:

array([
        [11, 12, 13],
        [14, 15, 21],
        [22, 23, 24]
      ])

如您所见,原始的第一行会延伸到第二行,依此类推,而最后一个像素则消失了。这是因为np.resize()实际上并没有改变任何数据。它只是为内存中存在的数据指定了不同的形状,而原始行保持连续的顺序(或者列,如果您使用Fortran样式的数组)。

你真正想要的是Pillow的resize()

newimg = Image.fromarray(imtopix)
newimg = newimg.resize((200, 200), resample=Image.BILINEAR)

选择适合您的用例的任何重采样方法。

© www.soinside.com 2019 - 2024. All rights reserved.