我有一个1920x1080 uint8矩阵,由零和由Matlab中的零组成。我们称之为“形象”。我想要做的是将此图像导出为二进制,这意味着输出的每个字节应包含8个像素的信息。 简而言之:我想要每像素1位。
如果我理解得很好,我不能只使用“逻辑(...)”函数将其转换为Matlab中的二进制文件,因为逻辑仍然存储在内存中的8位(尽管它们的值只能是0或1当然)。
我想通过以特定格式接受图像的“.dll”导出图像(以便更快地传输到USB设备)。
这是“。dll”所期望的:( 1字节= 8个连续位)
我应该如何重组数据?我想这取决于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,[])';
此解决方案可能对其他人有所帮助,无论是某一天还是其他人!
答案 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);