Python 平铺图像需要很长时间
我有下面的代码,基本上是获取一个图像并将其放在像素上,换句话说,获取图像的每个像素并创建一个10x10“像素”,其中包括它们之间的空白,如下所示: 这变得惊人的慢,我想知道这是正常的还是我在做一些冗余操作Python 平铺图像需要很长时间,python,image-processing,Python,Image Processing,我有下面的代码,基本上是获取一个图像并将其放在像素上,换句话说,获取图像的每个像素并创建一个10x10“像素”,其中包括它们之间的空白,如下所示: 这变得惊人的慢,我想知道这是正常的还是我在做一些冗余操作 import numpy as np from scipy.misc import lena import matplotlib.pyplot as plt def rect(x, y): res = (np.abs(x) < .5)*(np.abs(y) < .5
import numpy as np
from scipy.misc import lena
import matplotlib.pyplot as plt
def rect(x, y):
res = (np.abs(x) < .5)*(np.abs(y) < .5)
return res
def placeOnSLM(FF, image):
step = .1
x, y = np.mgrid[0:image.shape[0]+step:step, 0:image.shape[1]+step:step]
outImage = np.zeros(x.shape)+np.min(image)
for ix in range(image.shape[0]):
print ix,'of',image.shape[0]
for iy in range(image.shape[1]):
outImage[(np.abs(x-ix-.5)/FF < .5) * (np.abs(y-iy-.5)/FF < .5)] = image[ix, iy]
# outImage += image[ix, iy]*rect((x-ix-.5)/FF, (y-iy-.5)/FF)
return outImage
if __name__ == '__main__':
num = 10
image = placeOnSLM(.9, lena()[:num,:num])
plt.imshow(lena()[:num,:num],'gray', interpolation='none')
plt.colorbar()
plt.figure()
plt.imshow(image,'gray',interpolation='none')
plt.colorbar()
plt.show()
将numpy导入为np
从scipy.misc导入lena
将matplotlib.pyplot作为plt导入
def rect(x,y):
res=(np.abs(x)<0.5)*(np.abs(y)<0.5)
返回res
def位置LM(FF,图像):
步骤=.1
x、 y=np.mgrid[0:image.shape[0]+步骤:步骤,0:image.shape[1]+步骤:步骤]
outImage=np.zero(x.shape)+np.min(image)
对于范围内的ix(image.shape[0]):
打印ix,“of”,图像.shape[0]
对于范围内的iy(image.shape[1]):
outImage[(np.abs(x-ix-.5)/FF<.5)*(np.abs(y-iy-.5)/FF<.5)]=图像[ix,iy]
#outImage+=图像[ix,iy]*rect((x-ix-.5)/FF,(y-iy-.5)/FF)
返回输出图像
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
num=10
image=placeOnSLM(.9,lena()[:num,:num])
imshow(lena()[:num,:num],'gray',interpolation='none')
plt.colorbar()
plt.图()
plt.imshow(图像,'gray',插值='none')
plt.colorbar()
plt.show()
编辑:
我使用的操作系统是Ubuntu13.10您的主要处理步骤如下:
for ix in range(image.shape[0]):
print ix,'of',image.shape[0]
for iy in range(image.shape[1]):
outImage[(np.abs(x-ix-.5)/FF < .5) * (np.abs(y-iy-.5)/FF < .5)] = image[ix, iy]
用以下代码替换它可以显著加快速度:
ixD = int(np.ceil((-FF/2 + ix + .5)*10))
ixU = int(np.ceil((FF/2 + ix + .5)*10))
iyD = int(np.ceil((-FF/2 + iy + .5)*10))
iyU = int(np.ceil((FF/2 + iy + .5)*10))
outImage[ixD:ixU, iyD:iyU] = image[ix, iy]
一个不使用for循环的解决方案呢?我不太确定,因为我没有太多使用matplotlib,但我假设它与matlab类似,所以我将在matlab中编写,希望将它转换为matplotlib很简单 解决方案很简单:使用matlabs imresize函数调整图像大小,但将插值设置为“最近”,而不是双线性/双三次。如果将图像放大10倍,它基本上将生成10x10个面片,其值等于原始图像的一个像素。下面的代码执行此操作,然后添加边距。(for循环只是测试n的各种值)
在我的测试中,当n=1000时,图像的创建时间为0.96秒(虽然我有一个quadcore i5@3.3 GHz.OS:Ubuntu 11.10.你说的“变得惊人的慢”是什么意思?就像它随着你添加更多的块而变慢一样?是的,当n=10时,它小于1秒,而当n=100时,它接近10分钟而不是100秒,直觉上我假设它的比例为O(n^2)但是我尝试初始化
outImage
正是因为你遇到的原因。outImage=np.zeros(x.shape)+np.min(image)
简单地访问内存空间会产生这样的问题吗?@evan54我不这么认为,但运行时分析有一些有趣的结果。duuude!!绘图很棒!我在我的电脑上试用过,但它对我的内存使用没有多大影响…即我的CPU刚刚用完,但内存似乎很好。我一直在尝试找出一种稀疏的方法来解决这个问题可能会有所改善,如果是内存问题,我发现了问题所在!这与稀疏矩阵无关,而是与我如何使用真-假方法(不确定真名是什么)寻址outImage
有关。我会编辑你的答案,也许你可以再次运行绘图?
ixD = int(np.ceil((-FF/2 + ix + .5)*10))
ixU = int(np.ceil((FF/2 + ix + .5)*10))
iyD = int(np.ceil((-FF/2 + iy + .5)*10))
iyU = int(np.ceil((FF/2 + iy + .5)*10))
outImage[ixD:ixU, iyD:iyU] = image[ix, iy]
ns= [10:10:100, 500, 1000];
times= zeros(size(ns));
for i= 1:length(ns)
n= ns(i);
s= 10; % 10x10 pixels in the result = 1x1 of the original image
margin= 2;
% create the image
im= rand(n,n);
tic
% resize the image
im2= imresize(im, (s+margin)*size(im), 'nearest');
% add margins
[x,y]= meshgrid([0:n]*(s+margin), [1:margin]);
inds= x(:)+y(:);
im2(inds,:)=0; im2(:, inds)=0;
times(i)= toc;
% imagesc(im2); pause; % visualize
end
plot(ns, times);