【问题标题】:Create a chart from video color palettes in Matlab在 Matlab 中从视频调色板创建图表
【发布时间】:2017-09-08 22:27:58
【问题描述】:

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

首先,我加载视频并逐帧计算平均颜色,然后将所有三个 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')

问题在于,即使我的合成矩阵似乎包含正确的值,synthesis.png 也是黑白的,似乎不能很好地代表视频。

有什么帮助?

【问题讨论】:

  • video 转换为 double 类以使其与其余变量一致,即将行 video=readFrame(v); 替换为 video=im2double(readFrame(v));

标签: image matlab image-processing video frame


【解决方案1】:

第一件事是第一,为什么是imsave 而不是imwrite?据我所知,imsave 用于保存以图形显示的图像。

要注意的另一件事是动态范围 - imwrite 状态的文档

如果 A 是数据类型为 double 或 single 的灰度或 RGB 彩色图像,则 imwrite 假定动态范围为 [0,1] 并在将数据作为 8 位值写入文件之前自动将数据缩放 255 .如果 A 中的数据是单数据,请将 A 转换为双数据,然后再写入 GIF 或 TIFF 文件。

因此,您需要确保合成的值确实位于 [0,1] 之间,如果不是,则应将它们缩放到该范围内,例如synthesis = synthesis./255 如果您的视频帧中有 8 位值。

【讨论】:

    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2011-05-23
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多