r - 如何从像素中提取位域
问题描述
我有一张来自卫星的图像,其像素值在 0 到 255 之间。该图像包含在 48 位产品中存储的信息 No/Yes (0/1) 的多个测试。我需要以像素为单位获取测试信息;具体来说,我需要获取位(19)的信息。
我可以假设对于 value = 0 的像素,所有测试的信息都消失了 No (0); 但是,对于值大于 0 的像素,情况并非如此。我可以提取像素值,但是如何从 R 中的像素中提取位域信息?
你肯定见过类似的东西,你能指导我在 R 中做到这一点吗?
我使用了 intToBits(),但它只返回 32 位,我不确定这是否是正确的答案。
解决方案
这个问题可能很有用:如何将整数转换为二进制向量?
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
仅适用于整数),因此需要一些有关如何将像素读入值的详细信息来帮助您。
有一些包可以返回大数的二进制表示,例如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
然后,您需要使用or再次强制转换为一个数字as.integer
。但是,这是从数字的开头算起,而不是结尾,所以你真的需要start=
and stop=
at (64:1)[19]
or 46。
大概您需要的数据不仅仅是第 19 个值,因此您还可以使用strsplit(your_bits48, "")
将位串拆分为每个值,然后可以以任何您想要的方式对其进行索引。
推荐阅读
- sql-server - 连接到 Azure SQL 数据库时出错。信号量超时期限已过。(Microsoft SQL Server,错误:121)
- postman - 如何通过邮递员的测试访问路径参数?
- android - setSupportActionBar 不适用于 YouTubeBaseActivity
- python - Google oauth - 获取用户电子邮件
- c - 组合宏会产生错误
- php - htaccess 正则表达式忽略 url 中的查询字符串
- java - 我需要根据响应中的一些值来阻止
- python - 如何通过 tkinter 中的按钮重新加载读数?
- javascript - 如何修改数组结构
- javascript - 如何在执行函数之前加载一些图像