Как извлечь битовое поле из пикселей - PullRequest
1 голос
/ 27 марта 2019

У меня есть изображение со спутника со значениями пикселей от 0 до 255. Это изображение содержит несколько тестов хранения информации Нет / Да (0/1) в 48-битном продукте.Мне нужно получить информацию для теста в пикселях;в частности, мне нужно получить информацию о бите (19).

Я могу предположить, что для пикселя со значением = 0 информация для всех тестов исчезла бы как Нет (0);однако это не относится к пикселям со значениями больше 0. Я могу извлечь значение пикселя, но как я могу извлечь информацию о битовых полях из пикселя в R?

Конечно, вы видели нечто подобное,не могли бы вы подсказать мне сделать это в R?

Я использовал intToBits (), но это возвращает только 32 бита, и я не уверен, что это правильный ответ.

1 Ответ

2 голосов
/ 27 марта 2019

Этот вопрос может быть полезен: Как преобразовать целое число в двоичный вектор?

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 для каждого канала, красный / синий / зеленый / альфа).Вы упомянули, что ваше изображение имеет 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= и stop= при (64:1)[19] или 46.

Предположительно, вам нужно больше данных, чем только 19-го числа.значение, так что вы также можете использовать strsplit(your_bits48, ""), чтобы разбить цепочку битов на каждое значение, которое затем можно проиндексировать любым удобным для вас способом.

...