如何将8位二进制列数组的位分成单独的列或单独的数组?

时间:2014-04-11 14:17:07

标签: image matlab image-processing bit

考虑以下数组:

>> a=[26;94;32];
>> b=dec2bin(a,8);
>> c=str2num(b);
>> d1=bitget(c,1);
>> d2=bitget(c,2);
>> d3=bitget(c,3);
>> d4=bitget(c,4);
>> d5=bitget(c,5);
>> d6=bitget(c,6);
>> d7=bitget(c,7);
>> d8=bitget(c,8);
>> e1=bitget(a,1);
>> e2=bitget(a,2);
>> e3=bitget(a,3);
>> e4=bitget(a,4);
>> e5=bitget(a,5);
>> e6=bitget(a,6);
>> e7=bitget(a,7);
>> e8=bitget(a,8);  

我希望这些结果来自代码:

d1 = e1  
d2 = e2
d3 = e3  
d4 = e4
d5 = e5
d6 = e6
d7 = e7
d8 = e8  

但实际上我们有结果:

d1 = e1  
d2 = e2
d3 = e3  
d4 != e4
d5 != e5
d6 != e6
d7 != e7
d8 != e8  

你能告诉我为什么吗?

实际上我想在数组的不同列或不同的列数组中分别写入b或c的位,并将其用于位平面切片。
我不想直接使用bitget(这是我的图像处理课程的家庭作业,教授强调不直接使用matlab图像处理功能)。你能否告诉我如何在不降低代码速度的情况下做到这一点?

2 个答案:

答案 0 :(得分:1)

b位到双数组中?试试这个 -

c = b-'0'

答案 1 :(得分:1)

基本上有可能做你想做的事。

第一个mentioned by Divakar

b = dec2bin(a,8)
c = b-'0'

将返回:

c =

     0     0     0     1     1     0     1     0
     0     1     0     1     1     1     1     0
     0     0     1     0     0     0     0     0

但这不是Matlab内部使用位数组的方式,而是假设一个"镜像"比特方向。

要实现这一目标,您只需使用de2bi

c = de2bi(a,8)

会给你:

c =

     0     1     0     1     1     0     0     0
     0     1     1     1     1     0     1     0
     0     0     0     0     0     1     0     0

这些数组现在适用于函数bitget,它也适用于这个"镜像"取向。这就是你得错的结果。

因此,对于第二种解决方案,比较工作正常:

d6 = c(:,6)
e6 = bitget(a,6)

d6 =

     0
     1
     0


e6 =

     0
     1
     0

不幸的是de2bi需要通信系统工具箱,如果您没有,则需要将Divakars解决方案调整为:

b = dec2bin(a,8)
c = fliplr(b-'0')

最终比较:

e = [ bitget(a,1),bitget(a,2),bitget(a,3),bitget(a,4), ...    
      bitget(a,5),bitget(a,6),bitget(a,7),bitget(a,8) ]
comp = all( c == e ,3 )

comp =

     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1