python - 无法正确将数组转换为图像
问题描述
我想从文件中读取图像,将其调整为平方尺寸(调整大小),然后将数组转换为图像以显示它。所以我为它写了下面的代码,但不幸的是 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()
解决方案
Numpy'sresize()
不会做你认为它做的事情。它不会沿其轴重新采样数组。
假设您的源数组如下所示:
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 样式数组)。
你真正想要的是枕头resize()
:
newimg = Image.fromarray(imtopix)
newimg = newimg.resize((200, 200), resample=Image.BILINEAR)
选择适合您的用例的任何重采样方法。
推荐阅读
- python - 如何在带有文字的图形中绘制虚线?
- java - 如何列出 DCIM/Camera 文件夹中的文件?
- html - 为一个特定的标签内容调整 css
- reporting-services - 将 SSRS 2012 订阅的多份报告生成到一个 ZIP 文件中以通过电子邮件发送
- java - 如何将已保存的项目添加到 Flutter 中的收藏夹部分?
- php - 如何制作子文件夹域别名?
- javascript - TENSORFLOW.JS 3D 姿势估计不起作用
- android - 面向 Android 12 及更高版本的应用需要为“android:exported”指定一个显式值,但我有这样的值
- github - Toast UI Editor 在 Github 上编辑文件?
- jenkins - Jenkins 2.303.1 升级后 ProjectMatrixAuthorizationStrategy 管理员用户/密码不起作用