Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 平铺图像需要很长时间_Python_Image Processing - Fatal编程技术网

Python 平铺图像需要很长时间

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

我有下面的代码,基本上是获取一个图像并将其放在像素上,换句话说,获取图像的每个像素并创建一个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)
    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);