在Matlab中根据视频调色板创建图表

时间:2017-09-08 22:27:58

标签: image matlab image-processing video frame

我尝试使用视频每帧的平均颜色创建图表。然后我想将它们拼接在一起以创建色谱。

首先,我加载视频并逐帧计算平均颜色,然后将三个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也是黑白的,并且似乎没有代表视频。

有什么用呢?

1 个答案:

答案 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