Da die Funktion -average von ImageMagick bei größeren Bildformaten und/oder Anzahlen zu mittelnder Bilder schnell an Speichergrenzen stößt (auf meinem 16 MiB-Boliden (hüstel!) geht 1280 x 720 x 1500 noch gut, bei 1280 x 720 x 5000 wird es dagegen unzumutbar langsam bzw. - ich habe es nicht bis zum Ende laufen lassen - es sieht so aus, als hinge sich ImageMagick auf, was bei 1280 x 720 x 25000 dann definitiv passiert) habe ich ein Skript geschrieben, das lange, z. B. aus Videos mit ffmpeg extrahierte Einzelbildfolgen in gleich große, für -average bequem handhabbare Tranchen aufteilt, diese dann jeweils mittelt und die so erzeugten Bilder wiederum mittelt, so dass am Ende für die ganze Bildfolge ein gemitteltes Bild steht. Dazu darf die Gesamtzahl der Bilder natürlich keine Primzahl sein und es muss der größte ganzzahlige Teiler beim Aufteilen der Tranchen verwendet werden... hier der Code:
Code: Alles auswählen
digits()
{
c=1
d=0
while [ "$c" -le "$1" ]
do
c=$((c*10))
d=$((d+1))
done
return $d
}
#function leadingzeroes()
leadingzeroes()
{
lz=""
for i in $(seq 0 $1)
do
lz=${lz}0
done
echo $lz
return $lz
}
d="/home/Video/mudcompilation/pre/"
series=mud007
cd $d
filenum_original=$(find $workdir -type f | wc -l)
filenum=$filenum_original
prim=(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541)
i=0
l=0
primefacs=()
while [ $((prim[$i]*prim[$i])) -le $filenum ]
do
if [ $((filenum%prim[$i])) -eq 0 ]
then
primefacs+=(${prim[$i]})
filenum=$((filenum/prim[$i]))
l=$((l+1))
else
i=$((i+1))
fi
done
#echo "Primfaktoren von "${filenum_original}": "
a=1
for i in $(seq 0 $((l-1)))
do
#echo ${primefacs[$i]}
a=$((a*${primefacs[$i]}))
done
echo $a
if [ $i -gt 100 ]
then
echo "Die Bildsequenz kann leider nicht in gleich große Tranchen aufgeteilt werden!"
else
mkdir avgs
fac=$a
tra=$((filenum_original/fac))
digits $fac
facdigits=$?
for i in $(seq 1 $fac)
do
subd=${series}"_"${i}
mkdir $subd
echo "Verzeichnis "$subd" wird erzeugt!"
digits $i
idigits=$?
start=$(((i-1)*tra+1))
end=$((tra*i))
for j in $(seq $start $end)
do
digits $j
jdigits=$?
echo $jdigits
zeroes=`leadingzeroes $((5-jdigits-1))`
fn=${series}"-"${zeroes}${j}".png"
cp $fn $subd
echo "Datei "${fn}" wurde nach "${subd}" kopiert!"
done
cd $subd
zeroes2=`leadingzeroes $((facdigits-idigits-1))`
convert -average * "../avgs/${series}-"${zeroes2}${i}".png"
echo "Frames der Tranche "${i}" wurden gemittelt."
cd ..
done
cd avgs
convert -average * ../../avgtests/avgtest_010.png
echo "Gemittelte Tranchen-Frames wurden wiederum gemittelt."
cd ..
fi
Code: Alles auswählen
#include <iostream>
using namespace std;
int main()
{
unsigned short n=100, i=1, c=2, j;
while (i <= n)
{
j = 1;
while (j*j <= c)
{
if (j != 1 && c%j == 0) break;
j++;
}
if (j*j > c)
{
cout << c << endl;
i++;
}
c++;
}
return 0;
}