2017-02-21 1 views
0

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 
  1. 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}
  2. 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

Antwort

3

scikit-Bild (mit PIL unter die Haube) speichert die PNGs im 8-Bit-Format, während Oktav 16-Bit verwendet (wie @carandraug unten erwähnt, geschieht dies, weil Fließkomma-Daten in Octave zur Verfügung gestellt werden, die PNG nicht direkt unterstützt, so dass die Daten konvertiert werden stattdessen uint16). Dies allein würde den Unterschied in den Größen erklären (obwohl sie andere feine Unterschiede in der Art sind, wie ihre Codierer arbeiten).

scikit-image:

$ identify 000*.png 
0001.png PNG 100x100 100x100+0+0 8-bit RGB 256c 120B 0.000u 0:00.000 
0002.png[1] PNG 100x100 100x100+0+0 8-bit RGB 256c 90B 0.000u 0:00.000 
0003.png[2] PNG 100x100 100x100+0+0 8-bit RGB 256c 120B 0.000u 0:00.000 
0004.png[3] PNG 100x100 100x100+0+0 8-bit RGB 256c 90B 0.000u 0:00.000 
0005.png[4] PNG 100x100 100x100+0+0 8-bit RGB 256c 120B 0.000u 0:00.000 
0006.png[5] PNG 100x100 100x100+0+0 8-bit RGB 256c 90B 0.000u 0:00.000 
0007.png[6] PNG 100x100 100x100+0+0 8-bit RGB 256c 120B 0.000u 0:00.000 
0008.png[7] PNG 100x100 100x100+0+0 8-bit RGB 256c 90B 0.000u 0:00.000 
0009.png[8] PNG 100x100 100x100+0+0 8-bit RGB 256c 120B 0.000u 0:00.000 

Octave:

$ identify 000*.png 
0001.png PNG 100x100 100x100+0+0 16-bit RGB 98B 0.000u 0:00.000 
0002.png[1] PNG 100x100 100x100+0+0 16-bit RGB 192B 0.000u 0:00.000 
0003.png[2] PNG 100x100 100x100+0+0 16-bit RGB 98B 0.000u 0:00.000 
0004.png[3] PNG 100x100 100x100+0+0 16-bit RGB 192B 0.000u 0:00.000 
0005.png[4] PNG 100x100 100x100+0+0 16-bit RGB 98B 0.000u 0:00.000 
0006.png[5] PNG 100x100 100x100+0+0 16-bit RGB 192B 0.000u 0:00.000 
0007.png[6] PNG 100x100 100x100+0+0 16-bit RGB 98B 0.000u 0:00.000 
0008.png[7] PNG 100x100 100x100+0+0 16-bit RGB 192B 0.000u 0:00.000 
0009.png[8] PNG 100x100 100x100+0+0 16-bit RGB 98B 0.000u 0:00.000 

Auf meinem Rechner (ffmpeg 2.8.11-0ubuntu0.16.04.1), beiden Videos am Ende 116KB sein.

+0

Können Sie bitte einige Details zu Ihrem System und der von Ihnen verwendeten ffmpeg-Version angeben? –

+0

"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

Verwandte Themen