【发布时间】:2023-03-18 06:42:01
【问题描述】:
我的问题:
我在 Matlab 中有一个由零和一组成的 1920x1080 uint8 矩阵。让我们称之为我的“形象”。我想要做的是将此图像导出为二进制,这意味着输出的每个字节都应包含 8 个像素的信息。 简而言之:我想要每像素 1 位。
如果我理解得很好,我不能在 Matlab 中使用“logical(...)”函数将其转换为二进制,因为逻辑仍然以 8 位的形式存储在内存中(尽管它们的值只能是 0 或 1当然)。
我为什么需要这个?
我想通过接受特定格式图像的“.dll”导出图像(以便更快地传输到 USB 设备)。
输出格式:
这是“.dll”所期望的:(1 字节 = 8 个连续位)
- 图像从左到右读取,然后从上到下(通常的约定)
- 每个数据字节代表 8 个像素,例如
- (第一个字节)= [px8|px7|...|px1]
- (第二个字节)= [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,[])';
这个解决方案可能会对其他人有所帮助,总有一天!
【问题讨论】:
标签: matlab dll binary-data