Python快速对称中心图像下采样算法

Python快速对称中心图像下采样算法,python,image,performance,numpy,downsampling,Python,Image,Performance,Numpy,Downsampling,我正在尝试用Python加速一个简单的对称中心图像下采样算法。我已经用一种简单的方法将其编码为一个下限基准,但是我想让它工作得更快 为了简单起见,我的图像是一个分辨率为4608x4608的圆,我将使用这个比例的分辨率,我希望将采样图像的分辨率降低9倍,即512x512。下面是我生成的代码,它以高分辨率创建图像,并以9的倍数对其进行降采样 所有这些基本上都是围绕质心对称地将一个像素从高分辨率空间映射到低分辨率空间中的一个像素上,并将给定区域中高分辨率的所有像素和低分辨率的一个像素相加 import

我正在尝试用Python加速一个简单的对称中心图像下采样算法。我已经用一种简单的方法将其编码为一个下限基准,但是我想让它工作得更快

为了简单起见,我的图像是一个分辨率为4608x4608的圆,我将使用这个比例的分辨率,我希望将采样图像的分辨率降低9倍,即512x512。下面是我生成的代码,它以高分辨率创建图像,并以9的倍数对其进行降采样

所有这些基本上都是围绕质心对称地将一个像素从高分辨率空间映射到低分辨率空间中的一个像素上,并将给定区域中高分辨率的所有像素和低分辨率的一个像素相加

import numpy as np
import matplotlib.pyplot as plt
import time

print 'rendering circle at high res'

# image dimensions.
dim = 4608

# generate high sampled image.
xx, yy = np.mgrid[:dim, :dim]
highRes = (xx - dim/2) ** 2 + (yy - dim/2) ** 2
print 'render done'

print 'downsampling'
t0 = time.time()

# center of the high sampled image.
cen = dim/2
ds = 9

# calculate offsets.
x = 0
offset = (x-cen+ds/2+dim)/ds

# calculate the downsample dimension.
x = dim-1
dsdim = 1 + (x-cen+ds/2+dim)/ds - offset

# generate a blank downsampled image.
lowRes = np.zeros((dsdim, dsdim))

for y in range(0, dim):
    yy = (y-cen+ds/2+dim)/ds - offset
    for x in range(0, dim):
        xx = (x-cen+ds/2+dim)/ds - offset
        lowRes[yy, xx] += highRes[y, x]

t1 = time.time()
total = t1-t0
print 'time taken %f seconds' % total 
我已经在我的机器上安装了BLAS和LAPACK的numpy,我知道利用这一点可以获得显著的收益,但是我对如何继续有点困惑。这是我到目前为止的进步

import numpy as np
import matplotlib.pyplot as plt
import time

print 'rendering circle at high res'

# image dimensions.
dim = 4608

# generate high sampled image.
xx, yy = np.mgrid[:dim, :dim]
highRes = (xx - dim/2) ** 2 + (yy - dim/2) ** 2
print 'render done'

print 'downsampling'
t0 = time.time()

# center of the high sampled image.
cen = dim/2
ds = 9

# calculate offsets.
x = 0
offset = (x-cen+ds/2+dim)/ds

# calculate the downsample dimension.
x = dim-1
dsdim = 1 + (x-cen+ds/2+dim)/ds - offset

# generate a blank downsampled image.
lowRes = np.zeros((dsdim, dsdim))

ar = np.arange(0, dim)
x, y = np.meshgrid(ar, ar)

# calculating symettrically centriod positions.
yy = (y-cen+ds/2+dim)/ds - offset
xx = (x-cen+ds/2+dim)/ds - offset

# to-do : code to map xx, yy into lowRes

t1 = time.time()
total = t1-t0

print 'time taken %f seconds' % total
在我的机器上,当前版本大约快16倍,但它还不完整。我不确定如何有效地从高分辨率图像映射新的下采样像素


也许还有别的方法可以加快速度?不确定。。。谢谢

对于下采样图像中的给定像素,要对全分辨率图像中的哪些像素求和?我不是100%确定你所说的对称居中是什么意思。对称慢跑是正确的并且有效。我不确定的是,如何快速地将xx和yy中定义的像素位置从高分辨率映射到低分辨率。当你运行顶部代码段时,你是否注意到输出图像底部的伪影?事实上,当我将输入图像的尺寸更改为其他尺寸时,我会从这个算法中得到很多输出图像边缘上的伪影。这就是为什么我要问你想要求和的确切方式。当我搜索对称中心下采样时,第一个结果是这个问题。如果您澄清了下采样方法试图做什么或避免做什么,您可能会发现您只想使用具有适当插值顺序的标准插值函数。我想你可能只是不熟悉标准术语和概念。在最坏的情况下,如果您确实有小生境要求,您可以使用scikit image的函数传递逆坐标变换。此外,在重采样过程中,您需要迭代输出像素,并使用您选择的插值方法使用逆变换对输入图像进行采样。这可以在scikit图像功能参数中看到。请看这里的注释