【发布时间】:2015-05-08 12:02:08
【问题描述】:
以下代码通过将小像素合并为较大像素来降低 2D numpy 数组(图像)的分辨率。我想知道它是否可以做得更快,或者是否有更快的替代品。此外,任何一般的建议都会受到赞赏。例如,如果有一个代码在速度上相似,但会产生更平滑的缩小图像(例如通过使用样条)
import numpy as np
def reduce_img ( img, bin_fac=1 ):
assert( len( img.shape ) == 2 )
imgX0 = img.shape[0] # slow axis
imgX1 = img.shape[1] # fast axis
r0 = imgX0 % bin_fac
r1 = imgX1 % bin_fac
img = np.copy( img) [:imgX0 - r0, :imgX1-r1]
# bin the fast axis
img_C = img.ravel(order='C')
img = np.average( [ img_C[i::bin_fac] for i in xrange( bin_fac ) ],axis=0)
img = img.reshape( (imgX0-r0, (imgX1-r1)/bin_fac ) , order='C')
# bin the slow axis
img_F = img.ravel(order='F')
img = np.average( [ img_F[i::bin_fac] for i in xrange( bin_fac ) ],axis=0)
img = img.reshape( ((imgX0-r0)/bin_fac, (imgX1-r1)/bin_fac ), order='F' )
return img
这是一个结果
>> from pylab import *
>> imshow( img )
>> show()
>> img_r = reduce_img( img, bin_fac = 7 )
>> imshow( img_r )
>> show()
>> %timeit( reduce_img( img, bin_fac=7) )
1000 loops, best of 3: 655 µs per loop
【问题讨论】:
-
您是否在寻找
scipy.misc.imresize? -
我无法获取您的功能。甚至工作。重塑我们的一般定义
numpy.reshape(a, newshape, order='C'),你称它为好像你已经完成了img.reshape。您的示例图像的形状是(600, 400, 4),即使用np.imread读入。你尝试reshapeing 它,因为它只是一个元组(x,y)。你的新形状应该是(x, y, 4)。你用np.调用了一个reshape,而不是第二个。另外我不认为你的生成器 expr。正在做你认为他们正在做的事情。如果您认为他们会占用一小块像素的np.average,那么他们不会。 (至少不是这样)。 -
@ljetibo,你说得对,应该是 img = img.reshape( shape ) 等。我在将它复制到堆栈溢出时一定搞砸了。感谢您指出这一点!
-
另外,这是用于二维图像阵列,而不是更高维图像,例如 RGB。
标签: python performance image-processing numpy