在MATLAB中从二进制转换为十进制数

时间:2011-09-12 15:31:05

标签: matlab data-conversion

我在将二进制转换为十进制时遇到问题(看起来非常冗长)。

%% Read

clear all;
close all;
clc;
I=imread('test.png');
imshow(I);

%% Crop
I2 = imcrop(I);
figure, imshow(I2)
w=size(I2,1);
h=size(I2,2);
%% LBP
for i=2:w-1
    for j=2:h-1
        J0=I2(i,j);
        I3(i-1,j-1)=I2(i-1,j-1)>J0;
        I3(i-1,j)=I2(i-1,j)>J0;
        I3(i-1,j+1)=I2(i-1,j+1)>J0; 
        I3(i,j+1)=I2(i,j+1)>J0;
        I3(i+1,j+1)=I2(i+1,j+1)>J0; 
        I3(i+1,j)=I2(i+1,j)>J0; 
        I3(i+1,j-1)=I2(i+1,j-1)>J0; 
        I3(i,j-1)=I2(i,j-1)>J0;
        LBP(i,j)=I3(i-1,j-1)*2^8+I3(i-1,j)*2^7+I3(i-1,j+1)*2^6+I3(i,j+1)*2^5+I3(i+1,j+1)*2^4+I3(i+1,j)*2^3+I3(i+1,j-1)*2^2+I3(i,j-1)*2^1;
    end
end
figure,imshow(I3)
figure,imhist(LBP)

是否可以更改此行

LBP(i,j)=I3(i-1,j-1)*2^8+I3(i-1,j)*2^7+I3(i-1,j+1)*2^6+I3(i,j+1)*2^5+I3(i+1,j+1)*2^4+I3(i+1,j)*2^3+I3(i+1,j-1)*2^2+I3(i,j-1)*2^1;

更短的东西?

3 个答案:

答案 0 :(得分:2)

选项1:

简化您正在做的事情的一种方法是首先创建一个3乘3的比例因子矩阵(即2的幂)并在循环之前初始化它:

scale = 2.^[8 7 6; 1 -inf 5; 2 3 4];

然后,您可以使用这些矢量化操作替换循环内的所有内容:

temp = (I2(i-1:i+1,j-1:j+1) > I2(i,j)).*scale;
LBP(i,j) = sum(temp(:));

选项2:

或者,我相信你可以完全删除你的两个循环,并通过调用NLFILTER来替换它们来获取矩阵LBP

LBP = nlfilter(I2,[3 3],@(x) sum((x(:) > x(5)).*scale(:)));

答案 1 :(得分:1)

我不确定你在那里做什么,但bin2dec做了你想做的事吗?

答案 2 :(得分:0)

我正在使用COLFILT函数添加另一个解决方案。

它涉及将所有滑动窗口放入矩阵的列中,我们使用自定义函数处理它,然后将结果重新排列到原始矩阵中。在内部,它使用IM2COLCOL2IM函数。

以下是一个例子:

I = imread('coins.png');
fun = @(b) sum( bsxfun(@times, 2.^(8:-1:1)', ...
           bsxfun(@gt, b([1 4 7 8 9 6 3 2],:), b(5,:))) );
II = colfilt(I, [3 3], 'sliding', fun);
imshow(II, [])

screenshot

@gnovice的第二个答案进行比较,请阅读NLFILTER文档中的提示:

  

nlfilter可能需要很长时间才能处理大图像。在某些情况下,   colfilt函数可以更快地执行相同的操作。