Ich habe viele 750x750 Bilder. Ich möchte das geometrische Mittel von nicht überlappenden 5x5-Patches von jedem Bild nehmen und dann für jedes Bild die geometrischen Mittel berechnen, um ein Merkmal pro Bild zu erzeugen. Ich habe den Code unten geschrieben und es scheint gut zu funktionieren. Aber ich weiß, dass es nicht sehr effizient ist. Das Ausführen von etwa 300 Bildern dauert etwa 60 Sekunden. Ich habe ungefähr 3000 Bilder. Also, während es für meinen Zweck funktioniert, ist es nicht effizient. Wie kann ich diesen Code verbessern?Wie kann ich diesen Code schneller machen?
#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)))
könnte ein guter Kandidat für die Code-Review-Partner-Website. Stellen Sie jedoch sicher, dass Sie zuerst die Regeln für die Website überprüfen. – cel
Das klingt in der Tat sehr langsam für solch eine einfache Operation (ich denke, dass ein Teil von mir Berechnungen bis zur Kumulation der 4. Ordnung und viel mehr wie Histogramm-Entzerrung noch schneller ist). Das erste, was ich tun würde: probiere [scikit-image] (http://scikit-image.org/) aus, was dir eine Funktion namens [view_as_block] (http://scikit-image.org/docs/stable/api) gibt /skimage.util.html#view-as-blocks). Dies wird durch einige erweiterte numpy-Funktionen [as_strided] (http://www.scipy-lectures.org/advanced/advanced_numpy/#example-fake-dimensions-with-strides) implementiert. Ich kann nichts garantieren, aber es könnte viel schneller sein! – sascha
Code-Review hat nicht viel 'numpy' Traffic; während "Vektorisieren" eine reguläre Frage zu SO ist. Auch CR ist wählerischer über das Format. – hpaulj