Моя проблема :
У меня есть матрица uint8 1920x1080, сделанная из нулей и единиц в Matlab. Назовем это моим «образом». Что я хочу сделать, так это экспортировать это изображение как двоичное, что означает, что каждый байт вывода должен содержать информацию о 8 пикселях. Короче говоря: я хочу 1 бит на пиксель.
Если я правильно понял, я не могу просто преобразовать его в двоичный файл в Matlab с помощью функции «logical(...)», потому что логические значения по-прежнему хранятся в памяти как 8 бит (хотя их значение может быть только 0 или 1, конечно) .
Зачем мне это нужно?
Я хочу экспортировать изображение через «.dll», который принимает изображение в определенном формате (для более быстрой передачи на USB-устройство).
Формат вывода:
Вот что ожидает «.dll»: (1 байт = 8 последовательных битов)
- изображение читается слева направо, затем сверху вниз (обычное соглашение)
- every byte of data represents 8 pixels, e.g.
- (1st byte) = [px8|px7|...|px1]
- (2-й байт) = [px16|px15|...|px9]
- и так далее.
- обратите внимание, что каждая строка изображения имеет 1920 пикселей (которые можно разделить на 8, 1920/8 = 240), поэтому на строку изображения приходится 240 байтов.
Мой вопрос :
Как мне реорганизовать данные? Я думаю, это зависит от того, как Matlab хранит данные в памяти (а затем отправляет их в любую «.dll»)? Я понятия не имею об этом...
Вот код, который я бы использовал, если бы не ожидалось никаких трюков с памятью. Идея состоит в том, чтобы взять каждые 8 пикселей и построить из них 8-битное значение в правильном порядке, например. эти значения пикселей (1 0 0 0 0 0 1 0) станут равными 65 (выражены в десятичном виде). Затем я бы отправил новую матрицу в «.dll» и надеюсь, что это сработает.
FinalImage=zeros(1920,240); % 240 = number of bytes per line
for myRow=1:1080
for myByte=1:240
currentByte=0;
for myBit=0:7
currentByte=currentByte + 2^(7-myBit) * Image(myRow, 1 + 8*(myByte-1) + myBit );
end
FinalImage(myRow, myByte) = currentByte;
end
end
Решение :
С помощью Divakar я, наконец, забыл о циклах и предпочел этот простой код:
% convert every 8 pixels (values 0 or 1) in a row to one single pixel (value 0 to 255)
% (bi2de option used : "left most significant bit" in my case)
% (make sure the width of your image is a multiple of 8)
vect=bi2de(reshape(input_img',8,[])','left-msb');
img=reshape(vect,img_width/8,[])';
Это решение может быть полезно для кого-то еще, в тот или иной день!