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

在R语言中提取图像的网页安全色强度并生成数据框

提取图像的网页安全色强度并生成统一格式数据框

核心方案

通过固定网页安全色调色板,将所有图像强制映射到该调色板后,统计每种颜色的像素占比(强度),最终合并为每行对应一张图像、每列对应一种颜色的数据框。


步骤1:获取并预处理网页安全色集合

首先抓取标准网页安全色,转换为图像处理工具可识别的格式,确保调色板统一:

library(rvest)
library(dplyr)
library(magick)
library(tibble)
library(tidyr)
library(purrr)

# 抓取并清洗网页安全色列表
web_safe_colors <- read_html("https://en.wikipedia.org/wiki/Web_colors#Color_table") %>% 
  html_nodes("h3+ .wikitable td") %>% 
  html_text() %>% 
  trimws() %>% 
  unique() # 去除重复颜色

# 将十六进制颜色转为magick兼容的RGB字符串格式
web_safe_rgb <- lapply(web_safe_colors, function(hex) {
  col2rgb(hex) %>% as.vector() %>% paste(collapse = ",")
}) %>% unlist()

步骤2:编写单张图像的强度提取函数

该函数读取图像后,强制映射到固定调色板,统计每种网页安全色的强度(像素占比):

extract_web_safe_intensity <- function(image_source) {
  # 读取图像(支持本地路径或网络URL)
  img <- image_read(image_source)
  
  # 强制将图像颜色量化到网页安全色调色板
  img_quantized <- img %>% 
    image_quantize(colors = web_safe_rgb, colorspace = "rgb")
  
  # 提取颜色直方图并转换为数据框
  color_hist <- image_histogram(img_quantized, format = "df")
  
  # 将RGB值转回十六进制,匹配网页安全色列表
  color_hist$hex_color <- rgb(color_hist$red, color_hist$green, color_hist$blue, maxColorValue = 255)
  
  # 匹配所有网页安全色,填充强度(未出现的颜色强度设为0)
  intensity_tbl <- tibble(color = web_safe_colors) %>%
    left_join(
      color_hist %>% mutate(intensity = count / sum(count)) %>% select(hex_color, intensity),
      by = c("color" = "hex_color")
    ) %>%
    mutate(intensity = replace_na(intensity, 0))
  
  # 转换为宽格式,添加图像标识列
  intensity_wide <- intensity_tbl %>%
    pivot_wider(names_from = color, values_from = intensity) %>%
    mutate(image_id = image_source) %>%
    relocate(image_id) # 将图像标识列放在首位
  
  return(intensity_wide)
}

步骤3:批量处理图像生成最终数据框

将所有图像的路径/URL整理为向量,批量处理后合并为统一数据框:

# 示例:图像路径/URL向量
image_list <- c(
  "https://farm4.staticflickr.com/3579/3370591414_f321bd33ff_z.jpg",
  "./本地图像1.jpg",
  "./本地图像2.png"
)

# 批量处理所有图像
final_result <- map_dfr(image_list, extract_web_safe_intensity)

# 查看结果
print(final_result)

可选调整

  • 如果需要绝对像素数而非占比,将函数中的count / sum(count)替换为count即可
  • 若图像数量较多,可添加purrr::map_dfr(.progress = TRUE)显示处理进度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:40:26