如何从像素中提取位字段

时间:2019-03-26 21:36:47

标签: r byte pixel bit

我有一张来自卫星的图像,其像素值在0到255之间。此图像包含对48位产品中信息否/是(0/1)存储的几次测试。我需要以像素为单位获取测试信息。具体来说,我需要获取该位的信息(19)。

我可以假设对于像素= 0的像素,所有测试的信息都为否(0);但是,值大于0的像素不是这种情况。我可以提取像素值,但是如何从R中的像素提取位字段信息?

您肯定已经看到类似的内容,您可以指导我在R中执行此操作吗?

我使用了intToBits(),但是它只返回32位,因此我不确定这是否是正确的答案。

1 个答案:

答案 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仅适用于整数),因此有必要提供一些有关如何将像素读取为值的详细信息,以帮助您。

有些软件包可以返回大数的二进制表示形式,例如bit64https://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.numericas.integer强制转换为数字。但是,这是从数字的开头而不是结尾开始计算的,因此您确实需要在start=或46处stop=(64:1)[19]

大概您想要的数据不只是第19个值,因此您还可以使用strsplit(your_bits48, "")将位串拆分为每个值,然后可以按照您希望的任何方式对其进行索引。