使用八度和 python 生成的图像的不同文件大小
Different filesizes for images generated using octave and python
我正在使用 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
- 这两种代码生成的图像文件的大小不同。
- 八度{白色:192字节,黑色:98字节}
- Python{白色:120字节,黑色:90字节}
- 从这些八度和 python 图像生成的视频文件的大小彼此明显不同。
- Octave {文件大小:60 KB}
- Python {文件大小:116 KB}
为什么我们会有这种看似非常奇怪的行为?
编辑
由于有人建议该行为可能是由于八度和 python 使用不同的位深度来存储图像,我将八度代码更改为使用 8 位数字
im1 = uint8(255*ones(100,100)); # white
im2 = uint8(zeros(100,100)); # black
现在图像文件大小几乎相同
- 八度{白色: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
八度:
$ 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 (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
- 这两种代码生成的图像文件的大小不同。
- 八度{白色:192字节,黑色:98字节}
- Python{白色:120字节,黑色:90字节}
- 从这些八度和 python 图像生成的视频文件的大小彼此明显不同。
- Octave {文件大小:60 KB}
- Python {文件大小:116 KB}
为什么我们会有这种看似非常奇怪的行为?
编辑
由于有人建议该行为可能是由于八度和 python 使用不同的位深度来存储图像,我将八度代码更改为使用 8 位数字
im1 = uint8(255*ones(100,100)); # white
im2 = uint8(zeros(100,100)); # black
现在图像文件大小几乎相同
- 八度{白色: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
八度:
$ 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。