python - 使用 octave 和 python 生成的图像的不同文件大小

标签 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])
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
接下来,我使用 ffmpeg 使用以下命令从这两组图像中生成两个视频(交替的白色和黑色帧)
ffmpeg -r 10 -loglevel quiet \
       -i ./%04d.png -c:v libx264 \
       -preset ultrafast -crf 0 ./out.mkv
  • 这两种代码生成的图像文件大小不同。
  • Octave {白色:192 字节,黑色:98 字节}
  • Python {白色:120 字节,黑色:90 字节}
  • 从这些 octave 和 python 图像生成的视频文件的大小彼此显着不同。
  • Octave {文件大小:60 KB}
  • Python {文件大小:116 KB}

  • 为什么我们会有这种明显非常奇怪的行为?
    编辑
    由于有人建议该行为可能是由于 octave 和 python 使用不同的位深度来存储图像,我将 octave 代码更改为使用 8 位数字
    im1 = uint8(255*ones(100,100)); # white
    im2 = uint8(zeros(100,100));    # black
    
    现在图像文件大小几乎相同
  • Octave {白色:118 字节,黑色:90 字节}
  • Python {白色:120 字节,黑色:90 字节}

  • 但是视频文件的问题仍然相同, Octave :60K,python:116K

    最佳答案

    scikit-image(在底层使用 PIL)以 8 位格式保存 PNG,而 octave 使用 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
    

    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
    

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

    关于python - 使用 octave 和 python 生成的图像的不同文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42376822/

    相关文章:

    python - `py.test` 和 `__init__.py` 文件

    matlab - matlab中的8 channel 异步麦克风录音

    python - Inf在Matlab上的使用

    matlab - 在 Matlab 中生成具有时间相关频率的正弦信号

    python - 从视频文件中提取的音频太大

    php - 如何在 PHP 中将动态生成的视频缩略图作为 BLOB 上传到 MySQL 数据库中

    python - 在 Django 查询集过滤器中,如何检查 json 字段中的至少一个键是否具有非空值?

    python - 如何为王牌编写二十一点计分程序

    python - 使用 Python 获取视频属性而不调用外部软件

    image - 使用 ffmpeg/imagemagick 从图像制作视频