이것은 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
정말 최적화되지 않은)
내 netbook에서 126 초가 걸렸으며 Lena는 결국 아주 작은 이미지입니다.
편집 :
꽤 몇 평방 뿌리를 저장 rot_filters.var(1)
에 rot_filters.std(1)
을 변경할 수있는 제안을 얻었 그것은 5S의 순서로 뭔가를 면도.
당신이 (예를 들어'cProfile'로)를 프로파일 링 시도 유무 :
이제 우리는 우리가 윈도우를 생성하는 데 필요한 모든 정보가? – nneonneo
실제로'rotation_matrix' 함수가 262144 번 호출되었으므로 구할 수있는 시간이 있기 때문에 실제로는 알지 못합니다. 그리고 그것은 그것이 나에게 도움이 될 것 같은 방법을 모른다는 것을 지적 할 것입니다. 그러나 어쩌면 그것은'cProfile'을 사랑하는 법을 배우지 못했을 것입니다 ... – deinonychusaur