Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何解包12位&x27;单件包装';数_Matlab - Fatal编程技术网

Matlab 如何解包12位&x27;单件包装';数

Matlab 如何解包12位&x27;单件包装';数,matlab,Matlab,我有一个来自图像传感器的数据(2560x2160像素),编码为Mono12Packed 此编码定义为: Byte 0: Pixel 1 (bits 4:11) Byte 1: Pixel 1 (bits 0:3), Pixel 2 (bits 0:3) Byte 3: Pixel 2 (bits 4:11) 要解压缩此数据,我使用两种不同的代码: 第一个以12位的形式读取数据(所以我得到一半的值是“免费的”),然后我处理另一半 fseek(fid, 0, 'bof'); raw = fread

我有一个来自图像传感器的数据(2560x2160像素),编码为Mono12Packed

此编码定义为:

Byte 0: Pixel 1 (bits 4:11)
Byte 1: Pixel 1 (bits 0:3), Pixel 2 (bits 0:3)
Byte 3: Pixel 2 (bits 4:11)
要解压缩此数据,我使用两种不同的代码:

第一个以12位的形式读取数据(所以我得到一半的值是“免费的”),然后我处理另一半

fseek(fid, 0, 'bof');
raw = fread(fid, 2560*2160, 'ubit12');
raw(1:2:end) = arrayfun( ...
    @(x) bitor(bitand(bitshift(x, 4), 4095), bitshift(x, -8)), ...
    raw(1:2:end) ...
);
dat = reshape(raw, [2560, 2160]);
第二种方法在逐字节读取数据时使用更“标准”的方法

raw = fread(fid, ceil(2560*2160*1.5), 'ubit8');
dat = zeros(2560*2160, 1);
for i = 1:3:ceil(2560*2160*1.5)
    p1 = bitor(bitshift(raw(i), 4), bitand(raw(i+1), 15));
    p2 = bitor(bitshift(raw(i+2), 4), bitand(bitshift(raw(i+1), -4), 15));
    dat(ceil(i/1.5)) = p1;
    dat(ceil(i/1.5)+1) = p2;
end;
dat = reshape(dat2, [2560, 2160]);
尽管第二个速度要快得多(对我来说,这让我惊讶),但两个都非常慢。我确信它可以通过矢量化循环来加速,我只是不知道怎么做

或者可能有另一种解决方案,如何解包这些数据,因为它们似乎很常见

顺便说一句,有人能解释一下为什么数据是按这种方式排序的,而不是“排成一行”吗


感谢您的for循环的矢量化版本:

dat(1:2:end) = bitor(bitshift(raw(1:3:end), 4), bitand(raw(2:3:end), 15));
dat(2:2:end) = bitor(bitshift(raw(3:3:end), 4), bitand(bitshift(raw(2:3:end), -4), 15));

我使用以下代码进行测试:

%Create input data for testing:
I = (0:4095)';
J = zeros(1, numel(I)*1.5);

%Byte 0: Pixel 1 (bits 4:11)
%Byte 1: Pixel 1 (bits 0:3), Pixel 2 (bits 0:3)
%Byte 3: Pixel 2 (bits 4:11)
J(1:3:end) = floor(I(1:2:end) / 16);
J(2:3:end) = mod(I(2:2:end), 16)*16 + mod(I(1:2:end), 16);
J(3:3:end) = floor(I(2:2:end)/16);
f = fopen('raw12.bin', 'w');
fwrite(f, J, 'uint8');
fclose(f);

len = numel(I);

fid = fopen('raw12.bin', 'r');
raw = fread(fid, len*1.5, 'ubit8');
dat = zeros(len, 1);

dat(1:2:end) = bitor(bitshift(raw(1:3:end), 4), bitand(raw(2:3:end), 15));
dat(2:2:end) = bitor(bitshift(raw(3:3:end), 4), bitand(bitshift(raw(2:3:end), -4), 15));

% for i = 1:3:len*1.5
%     p1 = bitor(bitshift(raw(i), 4), bitand(raw(i+1), 15));
%     p2 = bitor(bitshift(raw(i+2), 4), bitand(bitshift(raw(i+1), -4), 15));
%     dat(ceil(i/1.5)) = p1;
%     dat(ceil(i/1.5)+1) = p2;
% end
%%dat = reshape(dat2, [2560, 2160]);
fclose(fid);

%Verify dat = I
all(dat == I)

我不明白你的最后一个问题,你说“不连续”是什么意思?什么行?我所说的“一行”是指这样,当你不需要做任何逐位操作时,只需读取12个连续的位。就像在第一个例子中,当我使用fread(…,'ubit12')时。顺序是:第一字节:像素1(位1:8),第二字节:像素1(位9:12)+像素2(位1:4),第三字节:像素2(位5:12)。这是一个非常好的问题。我猜如何定义打包标准的工程师不是程序员。