2011-09-29 32 views
2

我正在处理有关通过抖动将灰度图像转换为1位二进制图像的任务。我正在尝试一个简单的4x4矩阵,它将使图像比原始图像大16倍。如何提高这种numpy迭代的效率?

dithering_matrix = array([[ 0, 8, 2, 10], 
          [12, 4, 14, 6], 
          [ 3, 11, 1, 9], 
          [15, 7, 13, 5]], dtype=uint8) 
split_num = dithering_matrix.size + 1 

我读了512 * 512的图像im ndarray并做以下几件事:

output = list() 
for row in im: 
    row_output = list() 
    for pixel in row: 
     pixel_matrix = ((pixel/(256/split_num)) > dithering_matrix) * 255 
     row_output.append(pixel_matrix) 
    output.append(hstack(tuple(row_output))) 
output_matrix = vstack(tuple(output)) 

我发现了8-10s输出和我想的im上面花了很多时间循环。在某些软件中,同样的操作通常是在闪存中完成的。那么是否有可能提高效率?


UPDATE: @Ignacio巴斯克斯 - 艾布拉姆斯 我不跟探查用vert fimiliar :(我试过CPROFILE,其结果是奇怪

  1852971 function calls (1852778 primitive calls) in 9.127 seconds 

    Ordered by: internal time 
    List reduced from 561 to 20 due to restriction <20> 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 6.404 6.404 9.128 9.128 a1.1.py:10(<module>) 
     513 0.778 0.002 0.778 0.002 {numpy.core.multiarray.concatenate 
} 
    262144 0.616 0.000 1.243 0.000 D:\Python27\lib\site-packages\nump 
y\core\shape_base.py:6(atleast_1d) 
    262696 0.260 0.000 0.261 0.000 {numpy.core.multiarray.array} 
    262656 0.228 0.000 0.487 0.000 D:\Python27\lib\site-packages\nump 
y\core\numeric.py:237(asanyarray) 
     515 0.174 0.000 1.419 0.003 {map} 
    527019 0.145 0.000 0.145 0.000 {method 'append' of 'list' objects 
} 

A1.1的第10行。 py是第一行from numpy import *(之前的所有评论),这让我非常困惑。

+0

你的分析器说什么? –

回答

7

如果您使用Kronecker product将每个像素转换为4x4子矩阵,这将使您摆脱Python循环:

im2 = np.kron(im, np.ones((4,4))) 
dm2 = np.tile(dithering_matrix,(512,512)) 
out2 = ((im2/(256/split_num)) > dm2) * 255 

在我的机器上,这比你的版本快大约20倍。

+0

im2未在随后的计算中使用。错字? – unutbu

+0

@unutbu:很好。固定。 – NPE