Скажем, что существует матрица (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).
Проблема - огромное время вычислений.
Я знаю, что это неправильный способ сделать это. Есть ли какая-нибудь матричная операция, которую я могу сделать для этого, чтобы вычисление было сделано быстро?
Хм ... это должно быть: Bitshift (IMG (:,:, 1), 16) + ... Bitshift (IMG (:,:, 2), 8) + .. . img (:,:, 3); вместо этого? – davidleejy
Теперь вы должны добавить три панели. Также вы должны использовать 'squeeze', вероятно, чтобы сделать его' mxn', а не 'mxnx3'. Все остальное считало, что это путь. – Adriaan
good catch @davidleejy, спасибо! нет необходимости сжимать, так как он добавляет матрицы 3 mxnx1. Matlab автоматически сжимает размер синглтона. – crowdedComputeeer