2016-12-01 4 views
0

У меня есть файл изображения с 16 бит/пиксель. Используя Matlab, я хочу создать другой массив, в котором каждый элемент содержит только биты 2-10. Я могу сделать это в петле цикла, но это слишком медленно:Bitshift каждый элемент в массиве без цикла в Matlab

if mod(j,2) ~= 0  
    image1(i,j) = bitshift(image(i,j),-2); % shift the LL bits to the left 
else    
    tmp = bitand(image(i,j),3);   % save off the lower 2 bits 00000011 
    adder = bitshift(tmp,6);    % shift to new positions in LL 
    image1(i,j) = bitshift(image(i,j),-2); % shift the UL bits to the right 
    image1(i,j-1) = bitor(image1(i,j-1),adder); add in the bits from the UL 
end 

Есть ли способ сделать что-то вроде следующего?

image1(:,1:2:end) = bitshift(image(:,1:2:end),-2); 
etc 
+0

Вы попробовали так, как вы разместили? 'bithift' и связанные с ними функции принимают многомерный вход. – Suever

+0

Да, ошибка - это «несоответствие размеров подзапросов». – user7236719

+1

Вы пытались установить 'image1 = image' перед тем, как позвонить ему, чтобы убедиться, что 'image1' соответствует размеру? – Suever

ответ

0

bitshift, bitand и bitor вызова все работают на многомерные массивы в качестве первого входного сигнала. Вопрос, который вы видите, вероятно, потому, что вы инициализирован image1 быть разного размера, чем image и поэтому вы получите ошибку измерения рассогласования с помощью следующей команды

image1(:,1:2:end) = bitshift(image(:,1:2:end),-2); 

Чтобы исправить это, инициализировать image1 либо image или массив нулей размером image до вызова вышеуказанной команды

image1 = zeros(size(image)); 
image1(:,1:2:end) = bitshift(image(:,1:2:end),-2);