我尝试使用视频每帧的平均颜色创建图表。然后我想将它们拼接在一起以创建色谱。
首先,我加载视频并逐帧计算平均颜色,然后将三个RGB值存储在三个矢量中,最终创建合成图像。
v = VideoReader('video.mkv');
numFrames = ceil(v.FrameRate*v.Duration);
% R G B Color channels
stockRed = zeros(1,numFrames+1);
stockGreen = zeros(1,numFrames+1);
stockBlue = zeros(1,numFrames+1);
it = 1;
while hasFrame(v)
video = readFrame(v);
redChannel = video(:, :, 1);
greenChannel = video(:, :, 2);
blueChannel = video(:, :, 3);
%% RGB average
redMean = mean2(redChannel);
stockRed(1,it) = redMean;
greenMean = mean2(greenChannel);
stockGreen(1,it) = greenMean;
blueMean = mean2(blueChannel);
stockBlue(1,it) = blueMean;
it = it + 1;
end
%% Creating image
synthesis = cat(3,stockRed,stockGreen,stockBlue);
imsave(synthesis,'synthesis.png')
问题在于,即使我的合成矩阵似乎包含正确的值,synt.png也是黑白的,并且似乎没有代表视频。
有什么用呢?
答案 0 :(得分:0)
首先,为什么imsave
而不是imwrite
?据我所知,imsave
用于保存图中显示的图像。
要注意的另一件事是动态范围 - imwrite
州的文档
如果A是数据类型为double或single的灰度或RGB彩色图像,则imwrite假定动态范围为[0,1]并自动将数据缩放255,然后将其作为8位值写入文件。如果A中的数据是单个,则在写入GIF或TIFF文件之前将A转换为double。
因此,您需要确保合成的值确实介于[0,1]之间,如果不是,则应将它们缩放到该范围内,例如:如果您的视频帧中有8位值,则按synthesis = synthesis./255
。