在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
相关产品推荐
相关产品推荐

