我有一张来自卫星的图像,其像素值在0到255之间。此图像包含对48位产品中信息否/是(0/1)存储的几次测试。我需要以像素为单位获取测试信息。具体来说,我需要获取该位的信息(19)。
我可以假设对于像素= 0的像素,所有测试的信息都为否(0);但是,值大于0的像素不是这种情况。我可以提取像素值,但是如何从R中的像素提取位字段信息?
您肯定已经看到类似的内容,您可以指导我在R中执行此操作吗?
我使用了intToBits(),但是它只返回32位,因此我不确定这是否是正确的答案。
答案 0 :(得分:2)
这个问题可能有用:How to convert integer number into binary vector?
your_pixels <- c(0,1,100,255)
your_bits <- sapply(your_pixels, function(x) as.integer(intToBits(x)))
your_bits
[,1] [,2] [,3] [,4]
[1,] 0 1 0 1
[2,] 0 0 0 1
[3,] 0 0 1 1
[4,] 0 0 0 1
[5,] 0 0 0 1
[6,] 0 0 1 1
[7,] 0 0 1 1
[8,] 0 0 0 1
[9,] 0 0 0 0
[10,] 0 0 0 0
[11,] 0 0 0 0
[12,] 0 0 0 0
[13,] 0 0 0 0
[14,] 0 0 0 0
[15,] 0 0 0 0
[16,] 0 0 0 0
[17,] 0 0 0 0
[18,] 0 0 0 0
[19,] 0 0 0 0 # notice, no data here
[20,] 0 0 0 0
[21,] 0 0 0 0
[22,] 0 0 0 0
[23,] 0 0 0 0
[24,] 0 0 0 0
[25,] 0 0 0 0
[26,] 0 0 0 0
[27,] 0 0 0 0
[28,] 0 0 0 0
[29,] 0 0 0 0
[30,] 0 0 0 0
[31,] 0 0 0 0
[32,] 0 0 0 0
然后使用your_bits[19,]
获取测试#19的值(除非您从数字开头算起19,在这种情况下为your_bits[14,]
)。但是,您会注意到,0:255
整个范围的第19位将为0。数字255中使用的最高位是第8位。
最常见的图像编码通常是RGBA,每像素32位(每个通道0:255,红色/蓝色/绿色/ alpha)。您提到您的图像每个像素有48位。 R中的整数限制为32位(intToBits
仅适用于整数),因此有必要提供一些有关如何将像素读取为值的详细信息,以帮助您。
有些软件包可以返回大数的二进制表示形式,例如bit64
:https://cran.r-project.org/web/packages/bit64/index.html
library(bit64)
your_pixels48 <- c(0, 1, 100, 255, 2^48-1)
[1] 0.00000e+00 1.00000e+00 1.00000e+02 2.55000e+02 2.81475e+14
your_pixels48 <- as.integer64(your_pixels48)
integer64
[1] 0 1 100 255 281474976710655
your_bits48 <- as.bitstring(your_pixels48)
[1] "0000000000000000000000000000000000000000000000000000000000000000"
[2] "0000000000000000000000000000000000000000000000000000000000000001"
[3] "0000000000000000000000000000000000000000000000000000000001100100"
[4] "0000000000000000000000000000000000000000000000000000000011111111"
[5] "0000000000000000111111111111111111111111111111111111111111111111"
但是,请注意,这将返回二进制表示形式的字符串。在这种情况下,您可以使用字符串操作来访问第19个插槽:
substr(your_bits48, start = 19, stop = 19)
[1] "0" "0" "0" "0" "1"
然后,您需要再次用as.numeric
或as.integer
强制转换为数字。但是,这是从数字的开头而不是结尾开始计算的,因此您确实需要在start=
或46处stop=
和(64:1)[19]
。
大概您想要的数据不只是第19个值,因此您还可以使用strsplit(your_bits48, "")
将位串拆分为每个值,然后可以按照您希望的任何方式对其进行索引。