Вариант № 1: зацикливание на каждом пикселе и использование BITGET
Вы можете зациклить каждый пиксель (или значение RGB) на своем изображении и использовать BITGET , чтобы получить вектор нулей и единиц. Вот пример того, как использовать BITGET:
>> bitget(uint8(127),8:-1:1) % Get bits 8 through 1 for a uint8 value
ans =
0 1 1 1 1 1 1 1
Вариант № 2: Векторизованное решение с BITGET
Можно создать векторизованное решение, в котором вы зациклились бы над каждым битом вместо каждого пикселя , выполняя операцию BITGET для всей матрицы изображения каждый раз через цикл. Ниже приведена одна из таких реализаций:
function B = get_bits(A,N)
% Gets the N lowest bits from each element of A
B = zeros([size(A) 0]);
nDims = ndims(A)+1;
for iBit = N:-1:1
B = cat(nDims,B,bitget(A,iBit));
end
end
Если матрица A
имеет размеры 2-мерный (n-на-м) или 3-мерный (n-на-м-на-p), матрица B
будет на один размер больше. Дополнительное измерение будет иметь размер N
с самым старшим битом в индексе 1. Вы можете либо индексировать это измерение, чтобы получить значение бита, либо преобразовать B
в более легко визуализируемую форму. Вот пример использования:
>> A = uint8([126 128; 127 129]); % A 2-by-2 matrix of uint8 values
>> B = get_bits(A,8); % B is a 2-by-2-by-8 matrix
>> B(:,:,1) % Get bit 8 for each value in A
ans =
0 1
0 1
>> reshape(B,4,8) % Reshape B into a 4-by-8 matrix
ans =
0 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 1