You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中从MP4视频提取逐帧/逐秒色彩、饱和度、对比度信息

提取视频逐秒色彩、饱和度与对比度信息的R方案

核心思路

  • 用av包按时间间隔提取视频帧(每秒单帧或多帧)
  • 借助magick和基础R函数计算RGB均值、饱和度、对比度等指标
  • 将结果整合为每行对应一秒的结构化数据框

步骤实现

  1. 获取视频元数据:先获取视频时长、帧率,确定提取帧的时间点
  2. 逐帧提取与指标计算:对每个时间点的帧,转换为RGB数据,计算各项色彩指标
  3. 数据汇总:对每秒内的多帧结果取平均,生成最终时间序列数据框

完整代码示例

首先安装依赖包:

install.packages(c("av", "magick", "dplyr", "purrr"))

执行分析流程:

library(av)
library(magick)
library(dplyr)
library(purrr)

# 加载示例视频
video_path <- av_demo()

# 获取视频基本信息:时长(秒)、帧率
video_info <- av_video_info(video_path)
duration <- floor(video_info$duration)
fps <- video_info$video$framerate

# 定义每秒提取的帧数(多帧平均更稳定,可根据画面变化调整)
frames_per_sec <- 3

# 生成要提取的时间点(每秒均匀分布frames_per_sec个时间点)
time_points <- unlist(lapply(0:(duration-1), function(sec) {
  seq(sec, sec + 1 - 1/fps, length.out = frames_per_sec)
}))

# 提取帧并计算指标
frame_metrics <- map_dfr(time_points, function(t) {
  # 提取单帧
  frame <- av_read_frame(video_path, t) %>% image_read()
  
  # 转换为RGB数值数据框
  rgb_df <- frame %>% image_raster() %>% as.data.frame()
  rgb_df <- rgb_df %>% 
    mutate(
      R = col2rgb(col)[1,],
      G = col2rgb(col)[2,],
      B = col2rgb(col)[3,]
    )
  
  # 计算RGB通道均值
  avg_rgb <- colMeans(rgb_df[, c("R", "G", "B")])
  
  # 计算饱和度均值(用内置RGB转HSV函数)
  hsv_vals <- rgb2hsv(rgb_df$R/255, rgb_df$G/255, rgb_df$B/255)
  avg_saturation <- mean(hsv_vals[2,])
  
  # 计算对比度:基于亮度的标准差(亮度公式为ITU-R BT.601标准)
  brightness <- 0.299 * rgb_df$R + 0.587 * rgb_df$G + 0.114 * rgb_df$B
  contrast <- sd(brightness)
  
  # 返回单帧指标
  tibble(
    second = floor(t),
    avg_R = avg_rgb[1],
    avg_G = avg_rgb[2],
    avg_B = avg_rgb[3],
    avg_saturation = avg_saturation,
    contrast = contrast
  )
})

# 按秒汇总多帧的平均指标
final_metrics <- frame_metrics %>%
  group_by(second) %>%
  summarise(
    across(everything(), mean),
    .groups = "drop"
  ) %>%
  select(-second, second)  # 将秒数列移到最后,方便查看

# 查看结果
head(final_metrics)

优化建议

  • 帧数调整:画面变化剧烈的视频(如动作片)可将frames_per_sec调至5-10,静态画面为主的视频选1-2帧即可,平衡精度与速度
  • 对比度定义:若需要更贴合人眼感知的对比度,可替换为直方图第90百分位减第10百分位:contrast = quantile(brightness, 0.9) - quantile(brightness, 0.1)
  • 性能加速:处理4.5分钟长视频时,可使用furrr包实现并行提取与计算,减少等待时间
  • 扩展指标:若需要亮度(L*)、色相均值等,可通过image_convert(frame, colorspace = "lab")或colorspace = "hsv"转换后提取对应通道均值

内容的提问来源于stack exchange,提问作者socialresearcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:48:25