如何从高维3D数组中获取统计量向量?

3
我在进行一项图像缺陷聚类的项目。每个图像都与特定的缺陷类型相关联(并使用readJPEG读取一个三维像素数组)。
以下是图像示例: https://istack.dev59.com/pO9XY.webp
library(jpeg)
im <- readJPEG("C:/Users/Rayane_2/Desktop/Data/PCB1/PCB/PCB_USED/01.jpg")
dim(im)
[1] 1586 3034    3

所需过程描述如下:
For each picture in specific directory :

1/ Convert the JPG picture to a 3d array ** ( RGB data of jpg image is a 3d array ). 

2/ Summarize that 3d array in a **vector** of statistics using a function like `stats()` . 

3/ Return this vector and continue to build a full clustering dataset. 

我正在寻求将im[,,1]im[,,2]im[,,3]转换为向量as.vector()

之后,我需要提取一些统计数据,例如:

stats <-function(im){

return(c(min(as.vector(im[,,1])),max(as.vector(im[,,1])),sum(as.vector(im[,,1])),range(as.vector(im[,,1])),var(as.vector(im[,,1])), min(as.vector(im[,,2])),max(as.vector(im[,,2])),sum(as.vector(im[,,2])),range(as.vector(im[,,2])),var(as.vector(im[,,2])),min(as.vector(im[,,3])),max(as.vector(im[,,3])),sum(as.vector(im[,,3])),range(as.vector(im[,,3])),var(as.vector(im[,,3])))

}

有可能的解决方案是使用r包,例如在{summarytools}中使用descr()等,可查看R统计包获取当前统计数据。

由于im三维数组的高维度,运行速度非常缓慢

dim(im)
[1] 1586 3034    3

问题:

我正在寻找可能的解决方案,是否有其他能够以非常快的速度完成此任务的 R 函数/包?

谢谢,


2
您可以直接循环处理第三个维度,即 apply(im, 3, \(x) c(min =min(x), max = max(x), sum = sum(x))) - akrun
@akrun,很高兴再次见到你。这会产生错误 > 错误:在“apply(im,3,\”中出现意外输入 - Tou Mou
2
你可能使用的是较旧的 R 版本,请将 \(x) 更改为 function(x) - akrun
1
你想要分别获取所有3034列的摘要统计信息吗?还是只想针对第三维的每个1586 x 3034矩阵进行摘要统计? - akrun
准确地说,我只是在搜索每个第三维度的矩阵1586 x 3034的摘要。每个第三级矩阵代表以下颜色之一>红色,绿色,蓝色。 - Tou Mou
如果你要读取文件夹中的所有文件,那么可以使用lapplyapply,即 lst1 <- lapply(jpgfiles, function(file) apply(readJPEG(file), 3, function(x) c(min = min(x), max = max(x), sum = sum(x)))) - akrun
1个回答

2

我们可以使用apply函数和参数MARGIN = 3来循环遍历第三个维度。

out <- apply(im, 3, function(x) c(min =min(x), max = max(x), sum = sum(x)))

如果存在多个文件,首先将它们读入一个列表中。
lst1 <- lapply(jpgfiles, function(file) apply(readJPEG(file), 3, 
      function(x) c(min = min(x), max = max(x), sum = sum(x))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接