RGB图像转灰度图失败:gray()函数无效及维度不符求助
图像处理维度问题及调试方案
现有代码流程
1. 加载依赖与读取文件路径
library(OpenImageR) library(abind) path = list.files("../df", ".jpg", full.names = T)
2. 读取并合并图像
# 循环读取所有图像 im = lapply(path, readImage) # 合并为数组 com <- do.call(abind, im)
问题点
处理10张图像后,输出数组维度为416×600×30,但实际需求是416×600×10。
无效的灰度转换尝试
尝试以下代码转灰度,但数组维度仍为416×600×30:
grayscale <- gray(seq(0, 1, length = 255)) image(com[,,1], xaxt='n', yaxt='n', col=grayscale)
问题原因与解决方案
原因
每张JPG图像是RGB三通道格式,10张图合并后通道数为10×3=30,所以得到416×600×30的维度。你尝试的代码只是可视化时用灰度配色,并没有修改数组本身的通道结构。
方案1:读取时直接转灰度
在读取图像阶段就将每张图转为单通道灰度图,再合并:
im <- lapply(path, function(img_path) { # 读取图像并转为灰度 rgb_img <- readImage(img_path) rgb_2gray(rgb_img) }) # 合并后维度即为416×600×10 com_gray <- do.call(abind, im)
方案2:对已合并的数组做通道合并
如果已经得到了com数组,可通过通道均值将每3个RGB通道合并为1个灰度通道:
# 将30通道按每3个一组计算均值,得到10个灰度通道 com_gray <- apply(com, c(1,2), function(pixel_vals) { # 把每个像素的30个值按3个一组拆分,每组取均值 rowMeans(matrix(pixel_vals, ncol = 3)) }) # 调整数组维度为目标格式 dim(com_gray) <- c(416, 600, 10)
内容的提问来源于stack exchange,提问作者user20003920
相关产品推荐
相关产品推荐

