首页 > 解决方案 > 如何从像素中提取位域

问题描述

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

我可以假设对于 value = 0 的像素,所有测试的信息都消失了 No (0); 但是,对于值大于 0 的像素,情况并非如此。我可以提取像素值,但是如何从 R 中的像素中提取位域信息?

你肯定见过类似的东西,你能指导我在 R 中做到这一点吗?

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

标签: rbytepixelbit

解决方案


这个问题可能很有用:如何将整数转换为二进制向量?

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

然后要获得测试 #19 的值,请使用your_bits[19,](除非您从数字的开头数 19,在这种情况下your_bits[14,])。但是,您会注意到整个范围的第 19 位0:255将为 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.numeric然后,您需要使用or再次强制转换为一个数字as.integer。但是,这是从数字的开头算起,而不是结尾,所以你真的需要start=and stop=at (64:1)[19]or 46。

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


推荐阅读