Matlab:将uint8矩阵(由0和1组成)转换为二进制数据导出

时间:2014-06-03 19:27:17

标签: matlab dll binary-data

我的问题:

我有一个1920x1080 uint8矩阵,由零和由Matlab中的零组成。我们称之为“形象”。我想要做的是将此图像导出为二进制,这意味着输出的每个字节应包含8个像素的信息。 简而言之:我想要每像素1位。

如果我理解得很好,我不能只使用“逻辑(...)”函数将其转换为Matlab中的二进制文件,因为逻辑仍然存储在内存中的8位(尽管它们的值只能是0或1当然)。

为什么我需要这个?

我想通过以特定格式接受图像的“.dll”导出图像(以便更快地传输到USB设备)。

输出格式:

这是“。dll”所期望的:( 1字节= 8个连续位)

  • 图像从左到右,然后从上到下(通常惯例)
  • 数据的每个字节代表8个像素,例如
    • (第1个字节)= [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,[])';

此解决方案可能对其他人有所帮助,无论是某一天还是其他人!

1 个答案:

答案 0 :(得分:1)

假设input_image是输入二进制矩阵,output_dll_filepath是输出dll文件的路径,您可以尝试这种cell-array方法 -

<强>代码

%// Convert to 8-bit data
[M,N] = size(input_image)
cell1 = mat2cell(input_image,ones(1,M),8.*ones(1,N/8))
output_data = cellfun(@(x) bin2dec(num2str(fliplr(x),'%1d')),cell1);
output_data = reshape(output_data',[],1)

%// Write the 8-bit data as a dll file
fid = fopen(output_dll_filepath , 'w');
fwrite(fid, output_data, 'uint8');
fclose(fid);

或使用 -

output_data = bin2dec(fliplr(num2str(reshape(input_image',8,[])','%1d')))

然后使用之前使用过的Write the 8-bit data as a dll file


或者只是这个 -

fid = fopen(output_dll_filepath , 'w');
fwrite(fid, reshape(input_image',8,[]), 'ubit1');
fclose(fid);