2015-08-31 1 views
0

Скажем, что существует матрица (m x n x p), особенно. цветное изображение с каналами R G и B. Каждая информация канала имеет 8-разрядное целое число.Объединить матрицу (m x n x p) из 8-битных чисел с матрицей (m x n) из 24-битных чисел и наоборот

Но для анализа три 8-битовых значения должны быть объединены, чтобы получить 24-битное значение, и анализ выполняется на (m x n) матрице 24-битных значений.

После анализа матрицу необходимо разложить на три 8-битных канала для отображения результатов.

То, что я делаю прямо сейчас:

  • переборе всех значений в матрице
  • Преобразование каждого десятичного значения в двоичное (с использованием dec2bin)
  • Объедините три двоичные значения вместе, чтобы получить 24-битное число (с использованием strcat и bin2dec)

Код:

for i=1:m for j=1:n new_img(i,j) = bin2dec(strcat(... sprintf('%.8d',str2double(dec2bin(img(i,j,1)))), ... sprintf('%.8d',str2double(dec2bin(img(i,j,2)))), ... sprintf('%.8d',str2double(dec2bin(img(i,j,3)))))); end end

Для декомпозиции до трех 8-бит после анализа выполняется точный обратный процесс, итерации по значениям (m x n).

Проблема - огромное время вычислений.

Я знаю, что это неправильный способ сделать это. Есть ли какая-нибудь матричная операция, которую я могу сделать для этого, чтобы вычисление было сделано быстро?

ответ

1

Хотя я не понимаю, почему вы «объединили» плоскости rgb таким образом, это даст вам то, что вы ищете в одной команде.

a = bitshift(img(:,:,1),16)+... 
    bitshift(img(:,:,2,8)+... 
    img(:,:,3); 

И для инвертирования процесса требуется двойная маскировка в дополнение к смещению назад вправо.

A=zeros(size(img)); 
A(:,:,1)=bitshift(a,-16); 
A(:,:,2)=bitshift(bitand(a,2^16-2^8),-8); 
A(:,:,3)=bitand(a,2^8-2^0); 
+0

Хм ... это должно быть: Bitshift (IMG (:,:, 1), 16) + ... Bitshift (IMG (:,:, 2), 8) + .. . img (:,:, 3); вместо этого? – davidleejy

+0

Теперь вы должны добавить три панели. Также вы должны использовать 'squeeze', вероятно, чтобы сделать его' mxn', а не 'mxnx3'. Все остальное считало, что это путь. – Adriaan

+0

good catch @davidleejy, спасибо! нет необходимости сжимать, так как он добавляет матрицы 3 mxnx1. Matlab автоматически сжимает размер синглтона. – crowdedComputeeer

Смежные вопросы