使用Momocs对石斧轮廓执行PCA时遇报错求助
解决Momocs处理石斧轮廓PCA的报错问题
问题根源
你直接导入JPG图片得到的是RGB像素数组,而非Momocs要求的轮廓坐标点集合(Coo/Out对象),这导致coo_center等函数无法识别数据类型;后续PCA报错则是因为非数值矩阵无法被colMeans处理。
解决方案
1. 优化轮廓数字化流程(推荐)
用Inkscape处理时,不要导出JPG,直接导出轮廓的坐标数据:
- 选中石斧轮廓路径,通过
文件>另存为选择CSV格式,或用扩展>导出>导出路径到CSV获取X/Y坐标点 - 也可直接导出为SVG格式,Momocs支持直接解析SVG路径
2. 修正代码,导入正确的轮廓数据
方式一:导入SVG格式轮廓
如果导出的是SVG,用import_svg直接生成符合要求的对象:
library(Momocs) folder_path <- "~/Desktop/Test Umrisse" svg_files <- list.files(folder_path, pattern = "\\.svg$", full.names = TRUE) stone_axes <- import_svg(svg_files) # 执行居中、缩放、对齐 stone_axes <- stone_axes %>% coo_center() %>% coo_scale() %>% coo_align() # 傅里叶分析与PCA stone_axes_fourier <- efourier(stone_axes, nb.h = 10) pca_result <- PCA(stone_axes_fourier)
方式二:从现有JPG提取轮廓坐标(应急方案)
如果必须用当前JPG,结合imager包提取边缘坐标:
library(Momocs) library(imager) # 定义函数:从黑白JPG提取轮廓坐标 extract_coo_from_jpg <- function(jpg_path) { img <- load.image(jpg_path) %>% grayscale() img_bin <- threshold(img, thr = 0.5) # 二值化区分黑白 edges <- cannyEdges(img_bin) # 提取边缘 coords <- which(edges == 1, arr.ind = TRUE) # 反转Y轴(图片坐标系Y向下,转为常规坐标) coo <- data.frame(x = coords[,2], y = max(coords[,1]) - coords[,1]) return(coo) } # 批量处理图片并转为Momocs的Out对象 folder_path <- "~/Desktop/Test Umrisse" image_files <- list.files(folder_path, pattern = "\\.jpg$", full.names = TRUE) coo_list <- lapply(image_files, extract_coo_from_jpg) stone_axes <- Out(coo_list) # 后续标准化与分析流程同方式一 stone_axes <- stone_axes %>% coo_center() %>% coo_scale() %>% coo_align() stone_axes_fourier <- efourier(stone_axes, nb.h = 10) pca_result <- PCA(stone_axes_fourier)
3. 额外注意事项
- 确保Inkscape导出的是闭合单路径,避免多段路径导致数据异常
coo_scale会自动将轮廓缩放到单位周长,可消除原始图片分辨率差异的影响- 傅里叶分析的
nb.h参数可根据轮廓复杂度调整,一般10-30即可满足需求
内容的提问来源于stack exchange,提问作者Bernard Hoffmann
相关产品推荐
相关产品推荐

