使用octave和python

时间:2017-02-21 20:00:43

标签: python matlab ffmpeg octave scikit-image

我使用python(scikit-image)和octave生成200张图片如下

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])

八度

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

接下来,我使用ffmpeg使用以下命令从这两组图像生成两个视频(交替的白色和黑色帧)

ffmpeg -r 10 -loglevel quiet \
       -i ./%04d.png -c:v libx264 \
       -preset ultrafast -crf 0 ./out.mkv
  1. 这两个代码生成的图像文件的大小不同。

    • Octave {white:192 bytes,black:98 bytes}
    • Python {white:120 bytes,black:90 bytes}
  2. 从这些八度音阶和蟒蛇图像生成的视频文件的大小彼此显着不同。

    • Octave {filesize:60 kilobytes}
    • Python {filesize:116千字节}
  3. 为什么我们有这种明显非常奇怪的行为?

    修改

    由于有人建议使用不同的位深度来存储图像,行为可能是octave和python的行为,所以我将八度代码改为使用8位数

    im1 = uint8(255*ones(100,100)); # white
    im2 = uint8(zeros(100,100));    # black
    

    现在图像文件大小几乎相同

    • Octave {white:118 bytes,black:90 bytes}
    • Python {white:120 bytes,black:90 bytes}

    但视频文件的问题仍然相同,八度:60K,python:116K

1 个答案:

答案 0 :(得分:3)

scikit-image(使用引擎盖下的PIL)以8位格式保存PNG,而八度音程使用16位(如下面的@carandraug所述,这是因为浮点数据是在Octave中提供的,这是PNG所做的不直接支持,所以数据转换为uint16代替)。仅这一点就可以解释尺寸的差异(尽管它们可能是编码器工作方式的其他细微差别)。

scikit图像:

$ 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

八度:

$ 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

在我的机器上(ffmpeg 2.8.11-0ubuntu0.16.04.1),两个视频最终都是116KB。