在R中修改图像/ 3d数组

时间:2015-02-03 16:41:54

标签: arrays r tiff

我对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进行任何更改。

我错过了什么或正在循环正确的解决方案吗?

1 个答案:

答案 0 :(得分:1)

如果readTIFF来自tiff - 包,那么它会提供一个三维数组。使用for循环处理if(){}else{}语句将会非常缓慢。

我认为这会更快:

使用?tiff::readTIFF中的第一个示例进行一些测试(虽然我没有“背景”值。)

img[ , , 3] <- 0
img[ , , 1] <-  img[,,1] >= background | img[,,2] >= background
img[ , , 2] <- img[,,2] > background 

我相信这应该快得多。 R广泛使用“[&”和“&lt; - ”运算符来访问矩阵,数组,列表和数据帧。您应该多次阅读这些功能的帮助页面,我可能会说甚至十次,因为有很多东西需要了解它们。