Я использую Python (scikit-изображение) и октаву, чтобы генерировать 200 изображений следующим образомРазличных filesizes для изображений генерируются с использованием октавы и 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])
октавной
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 для генерации t горе-видео (чередующиеся белые и черные кадры) из этих двух наборов изображений с помощью следующей команды
ffmpeg -r 10 -loglevel quiet \
-i ./%04d.png -c:v libx264 \
-preset ultrafast -crf 0 ./out.mkv
Размеры файлов изображений, полученных с помощью обоих этих кодов различны.
- октавных {белые: 192 байт, черные: 98 байт}
- Python {белые: 120 байт, черный: 90 байт}
Размеры видеофайлы, полученных от этой октавы и Python изображения существенно отличаются друг от друга.
- Октав {размер файла: 60 килобайт}
- Python {размер файла: 116 килобайт}
Почему у нас это, видимо, очень странное поведение?
EDIT
Поскольку было высказано предположение о том, что поведение может быть оброк октавы и питон, используя различные битовые глубины для хранения изображений, я изменяю код октава использовать 8-битные числа
im1 = uint8(255*ones(100,100)); # white
im2 = uint8(zeros(100,100)); # black
и теперь размеры файлов изображений почти одни и те же
- Octave {белый: 118 байт, черный: 90 по тес}
- Python {белый: 120 байт, черный: 90 байт}
, но проблема по-прежнему то же самое для видео файлов, октаву: 60K, питона: 116K
Не могли бы вы предоставить некоторые сведения о вашей системе и версии ffmpeg, которую вы используете? –
«в то время как октава использует 16-бит». не так просто. В вопросе OP он никогда не преобразует данные в uint8, как в коде python. Из-за этого данные относятся к классу double, но поскольку запрашивается формат png (который не поддерживает значения пикселов с плавающей запятой), он преобразуется в 16 бит (и я полагаю, что это зависит от вариантов сборки graphicsmagick). – carandraug