如何在图像处理中使用scipy/numpy/python减小图像尺寸

12

你好,我有一张图片(1024 x 1024),我使用numpy库中的"fromfile"命令将该图片的每个像素放入了一个矩阵中。

我该如何通过修改该矩阵来减小图像的尺寸(例如将其减小至512 x 512)?

a = numpy.fromfile(( - path - ,'uint8').reshape((1024,1024))

我不知道如何修改矩阵 a 来减小图像的大小。如果有人有任何想法,请分享你的知识,我将不胜感激。谢谢。


编辑:

当我看到结果时,我发现我得到的阅读器读取了图像并将其放入“矩阵”中。所以我将“数组”改为了“矩阵”。

Jose 告诉我,我可以只取偶数行和偶数列,并将它们放入新的矩阵中。这将把图像减小到原来的一半大小。我需要使用什么命令在 scipy/numpy 中实现这个操作?

谢谢。


1
你不理解的问题是不知道如何在Python中实现,还是不知道如何进行图像缩放,或者两者都不理解? - talonmies
长话短说,这取决于你刚读入的图像类型。简单的问题是“为什么不能使用库?”你能否使用PIL调整大小,然后调用numpy.reshape()? - Jordan
图像文件的扩展名是.dat,我使用的阅读器可以读取该图像并将其放入矩阵中。我犯了一个错误,所以我编辑了帖子并将“数组”更改为“矩阵”,因为它被放置为矩阵形式。 - Hold_My_Anger
现在我的问题是如何从矩阵中仅取偶数行和偶数列。Scipy或Numpy中是否有任何函数可以实现这一点? - Hold_My_Anger
3个回答

22

如果您想调整到特定的分辨率,请使用scipy.misc.imresize:

import scipy.misc

i_width = 640
i_height = 480

scipy.misc.imresize(original_image, (i_height, i_width))

2
我认为这是正确的答案。直接,适用于图像的numpy数组格式。谢谢! - Ruby
7
在Scipy 1.0.0中,它已经过时了,应该使用skimage.transform.resize。 - CrowbarKZ
不幸的是,目前skimage替代方案没有“最近邻”选项,因此如果您需要将传感器数据从1280缩小到224,您需要自己进行额外的数学计算。 - bjorke

18

3

我认为最简单的方法是只取图像的一些列和一些行,制作一个数组样本。例如,只选取那些偶数行和偶数列,将其放入一个新数组中,就可以得到一张尺寸减半的新图像。


2
@LearnMore - 这很简单,只需要 y = x[::2, ::2](或者如果你想要每三行一个的话就是 ::3)。但是请注意,这会导致别名问题,因为它本质上只是“最近邻”插值(虽然非常非常快)。@tillsten 的答案通常是更好的方法,但会有更多的开销。这完全取决于你需要做什么。 - Joe Kington
@Joe Kington - 谢谢。y = x[::2, ::2] 中的第一个"::2"是指获取每2行,第二个"::2"是指获取每2列?x是我最初拥有的矩阵,而y是新矩阵吗? - Hold_My_Anger
是的,我尝试过了,最初的尺寸是2048 x 2048。现在它是1024 x 1024。非常感谢。 - Hold_My_Anger
正确的做法如下所述。使用缩放功能。 - Bogdan
1
这是错误的调整大小方式。如果您的图像在每个像素列和行上交替包含黑白线,则最终会得到完全黑色或白色的图像。正确的方法是使用下面描述的插值方法。 - London guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接