У меня много 750x750 изображений. Я хочу взять среднее геометрическое из неперекрывающихся патчей 5х5 от каждого изображения, а затем для каждого изображения средние геометрические средства для создания одной функции для каждого изображения. Я написал код ниже, и, похоже, он работает нормально. Но я знаю, что это не очень эффективно. Запуск на 300 или около того изображений занимает около 60 секунд. У меня около 3000 изображений. Таким образом, хотя это работает для моей цели, это не эффективно. Как я могу улучшить этот код?Как я могу сделать этот код быстрее?
#each sublist of gmeans will contain a list of 22500 geometric means
#corresponding to the non-overlapping 5x5 patches for a given image.
gmeans = [[],[],[],[],[],[],[],[],[],[],[],[]]
#the loop here populates gmeans.
for folder in range(len(subfolders)):
just_thefilename, colorsourceimages, graycroppedfiles = get_all_images(folder)
for items in graycroppedfiles:
myarray = misc.imread(items)
area_of_big_matrix=750*750
area_of_small_matrix= 5*5
how_many = area_of_big_matrix/area_of_small_matrix
n = 0
p = 0
mylist=[]
while len(mylist) < how_many:
mylist.append(gmean(myarray[n:n+5,p:p+5],None))
n=n+5
if n == 750:
p = p+5
n = 0
gmeans[folder].append(my list)
#each sublist of mean_of_gmeans will contain just one feature per image, the mean of the geometric means of the 5x5 patches.
mean_of_gmeans = [[],[],[],[],[],[],[],[],[],[],[],[]]
for folder in range(len(subfolders)):
for items in range(len(gmeans[0])):
mean_of_gmeans[folder].append((np.mean(gmeans[folder][items],dtype=np.float64)))
может быть хорошим кандидатом на сайт партнера по проверке кода. Однако сначала проверьте правила своего сайта. – cel
Это действительно очень медленно для такой простой операции (я думаю, что какой-то кодекс моего расчета до кумулянтов 4-го порядка и намного больше похож на выравнивание гистограммы был еще быстрее). Первое, что я сделал бы: try [scikit-image] (http://scikit-image.org/), который дает вам функцию с именем [view_as_block] (http://scikit-image.org/docs/stable/api /skimage.util.html#view-as-blocks). Это реализуется с помощью некоторой расширенной функции numpy [as_strided] (http://www.scipy-lectures.org/advanced/advanced_numpy/#example-fake-dimensions-with-strides). Я ничего не могу гарантировать, но это может быть намного быстрее! – sascha
Code-review не имеет большого количества «numpy» трафика; а «векторизация» - это регулярный вопрос о SO. Кроме того, CR является более четким в отношении формата. – hpaulj