Ich verwende Python (scikit-Bild) und Oktave 200 Bilder zu erzeugen, wie folgtUnterschiedliche Dateigrößen für Bilder erzeugt mit Oktave und Python
Python3
import numpy as np
from skimage.io import imsave
images = [255*np.ones((100,100), dtype=np.uint8), # white
np.zeros((100,100), dtype=np.uint8)] # black
for i in range(200): # save alternating black and white images
imsave('%04d.png'%(i+1), images[i%2])
Octave
pkg load image;
im1 = 255*ones(100,100); # white
im2 = zeros(100,100); # black
for i=1:200
name = sprintf('%04d.png', i);
if mod(i,2) == 0
imwrite(im1, name);
else
imwrite(im2, name);
end
end
Als nächstes benutze ich ffmpeg zu generieren aß zwei Videos (weiß und schwarz Rahmen abwechselnd) aus diesen beiden Gruppen von Bildern den folgenden Befehl
ffmpeg -r 10 -loglevel quiet \
-i ./%04d.png -c:v libx264 \
-preset ultrafast -crf 0 ./out.mkv
Größen von Bilddateien mit den beiden erzeugt durch diese Codes unterschiedlich sind.
- Octave {weiß: 192 Bytes, schwarz: 98 Bytes}
- Python {weiß: 120 Bytes, schwarz: 90 Bytes}
Größen von Video-Dateien aus dieser Oktave erzeugt und Python Bilder unterscheiden sich signifikant voneinander.
- Octave {Dateigröße: 60 KB}
- Python {Dateigröße: 116 KB}
Warum haben wir diese scheinbar sehr seltsame Verhalten?
EDIT
Da wurde vorgeschlagen, dass das Verhalten Gebühren könnte Oktave und Python unterschiedliche Bit-Tiefen unter Verwendung der Bilder zu speichern, ändere ich die Oktave Code 8-Bit-Zahlen verwenden
im1 = uint8(255*ones(100,100)); # white
im2 = uint8(zeros(100,100)); # black
und jetzt die Bilddateigrößen sind fast die gleichen
- Octave {weiß: 118 Bytes, schwarz: 90 Bytes}
- Python {weiß: 120 Bytes, schwarz: 90 Bytes}
aber das Problem ist immer noch das gleiche für Videodateien, Oktave: 60K, Python: 116K
Können Sie bitte einige Details zu Ihrem System und der von Ihnen verwendeten ffmpeg-Version angeben? –
"während Oktave 16-Bit verwendet." ist nicht so einfach. In der OP-Frage konvertiert er die Daten nie in uint8, wie er es im Python-Code tut. Aus diesem Grund sind die Daten der Klasse double, aber da das PNG-Format angefordert wird (das keine Gleitkomma-Pixelwerte unterstützt), wird es in 16 Bit konvertiert (und ich glaube, das hängt von den graphicmagick-Build-Optionen ab). – carandraug