這是我第一次嘗試在numpy中使用步幅,它相對於不同濾鏡的簡單迭代而言的確提高了速度,但它仍然非常慢(並且感覺像是有至少有一兩件事情是完全冗餘或低效的)。在numpy/scipy中優化實現一個旋轉蒙板
所以我的問題是:有沒有更好的方法來執行此操作或調整我的代碼,使其顯着更快?
該算法對每個像素執行9個不同濾鏡的局部評估,並選擇具有最小標準偏差的一個(我試圖實現Nagau和Matsuyma(1980)「複雜區域照片的結構分析」,如所述在圖像分析書中)。其結果是既平滑和邊緣銳化圖像(相當冷靜,如果你問我!)
import numpy as np
from scipy import ndimage
from numpy.lib import stride_tricks
def get_rotating_kernels():
kernels = list()
protokernel = np.arange(9).reshape(3, 3)
for k in xrange(9):
ax1, ax2 = np.where(protokernel==k)
kernel = np.zeros((5,5), dtype=bool)
kernel[ax1: ax1+3, ax2: ax2+3] = 1
kernels.append(kernel)
return kernels
def get_rotation_smooth(im, **kwargs):
kernels = np.array([k.ravel() for k in get_rotating_kernels()],
dtype=bool)
def rotation_matrix(section):
multi_s = stride_tricks.as_strided(section, shape=(9,25),
strides=(0, section.itemsize))
rot_filters = multi_s[kernels].reshape(9,9)
return rot_filters[rot_filters.std(1).argmin(),:].mean()
return ndimage.filters.generic_filter(im, rotation_matrix, size=5, **kwargs)
from scipy import lena
im = lena()
im2 = get_rotation_smooth(im)
(只是一個註釋,那麼get_rotating_kernel
還沒有真正得到優化,因爲幾乎沒有時間花費在那裏反正)
在我的上網本,它花了126s和莉娜畢竟是一個相當小的形象。
編輯:
我建議改變rot_filters.std(1)
到rot_filters.var(1)
節省相當多的平方根,它在5秒的順序剃掉的東西。
你試過剖析它(與例如'cProfile')? – nneonneo
其實我沒有想到因爲'rotation_matrix'函數被稱爲262144次,所以有時間可以被保存。無論哪一部分,它會指向我仍然不知道它會如何幫助我......但也許這只是我沒有學會去愛'cProfile' ... – deinonychusaur