在 R 中修改 image/3d 数组
Modifying an image/3d Array in R
我对 C 非常熟悉,但对 R 还是个新手,我正在努力确保正确处理数据类型。是否可以使用 *apply
类型的函数而不是两个循环来迭代 3d 数组的前两个维度?
#!/usr/bin/Rscript
#Make sure the "tiff" library is installed:
# apt-get install libtiff5-dev
# Rscript - <<< "install.packages('tiff',,'http://www.rforge.net/')"
library( "tiff" )
RGBlack <- readTIFF( "Imaging.tif", all=TRUE )
RGBlack <- RGBlack[[2]]
AdjustPixel <- function(pix, background){
# Blue is always off
pix[3] = 0
#Turn red off if > background
if( pix[1] < background ){
pix[1] <- 0
}
else {
pix[1] <- 1
}
#I green is > background turn on, and turn off red
if( pix[ 2] > background ) {
pix[1] <- 0
pix[2] <- 1
}
else {
pix[2] <- 0
}
return(pix)
}
background <- 10/256
#Doesn't Work
#RGBlack <- array( AdjustPixel( RGBlack[, , ], background ), dim=c(512,512,3))
#Works
for( row in 1:dim(RGBlack)[1] ){
for( col in 1:dim(RGBlack)[2] ) {
RGBlack[row, col, ] = AdjustPixel( RGBlack[row, col, ], background )
}
}
Array() 看起来很有前途但是
RGBlack <- array( AdjustPixel( RGBlack[,,] ), dim=c(dim1,dim2,3))
似乎没有对 RGBlack 进行任何更改。
我是不是遗漏了什么或者正在循环正确的解决方案?
如果 readTIFF
来自 tiff
包,那么它提供一个 3 维数组。使用 for 循环处理 if(){}else{}
语句会非常慢。
我认为这会快得多:
使用 ?tiff::readTIFF
中的第一个示例进行一些测试(尽管我没有 "background" 值。)
img[ , , 3] <- 0
img[ , , 1] <- img[,,1] >= background | img[,,2] >= background
img[ , , 2] <- img[,,2] > background
我相信这应该会快得多。 R 广泛使用“[”和“[<-”运算符来访问矩阵、数组、列表和数据帧。您应该阅读这些函数的帮助页面几遍,我什至说可能十遍,因为它们有太多值得学习的地方。
我对 C 非常熟悉,但对 R 还是个新手,我正在努力确保正确处理数据类型。是否可以使用 *apply
类型的函数而不是两个循环来迭代 3d 数组的前两个维度?
#!/usr/bin/Rscript
#Make sure the "tiff" library is installed:
# apt-get install libtiff5-dev
# Rscript - <<< "install.packages('tiff',,'http://www.rforge.net/')"
library( "tiff" )
RGBlack <- readTIFF( "Imaging.tif", all=TRUE )
RGBlack <- RGBlack[[2]]
AdjustPixel <- function(pix, background){
# Blue is always off
pix[3] = 0
#Turn red off if > background
if( pix[1] < background ){
pix[1] <- 0
}
else {
pix[1] <- 1
}
#I green is > background turn on, and turn off red
if( pix[ 2] > background ) {
pix[1] <- 0
pix[2] <- 1
}
else {
pix[2] <- 0
}
return(pix)
}
background <- 10/256
#Doesn't Work
#RGBlack <- array( AdjustPixel( RGBlack[, , ], background ), dim=c(512,512,3))
#Works
for( row in 1:dim(RGBlack)[1] ){
for( col in 1:dim(RGBlack)[2] ) {
RGBlack[row, col, ] = AdjustPixel( RGBlack[row, col, ], background )
}
}
Array() 看起来很有前途但是
RGBlack <- array( AdjustPixel( RGBlack[,,] ), dim=c(dim1,dim2,3))
似乎没有对 RGBlack 进行任何更改。
我是不是遗漏了什么或者正在循环正确的解决方案?
如果 readTIFF
来自 tiff
包,那么它提供一个 3 维数组。使用 for 循环处理 if(){}else{}
语句会非常慢。
我认为这会快得多:
使用 ?tiff::readTIFF
中的第一个示例进行一些测试(尽管我没有 "background" 值。)
img[ , , 3] <- 0
img[ , , 1] <- img[,,1] >= background | img[,,2] >= background
img[ , , 2] <- img[,,2] > background
我相信这应该会快得多。 R 广泛使用“[”和“[<-”运算符来访问矩阵、数组、列表和数据帧。您应该阅读这些函数的帮助页面几遍,我什至说可能十遍,因为它们有太多值得学习的地方。