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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:46:16