【问题标题】:Conversion from binary to decimal number in MATLAB在 MATLAB 中从二进制数转换为十进制数
【发布时间】:2011-09-12 15:31:05
【问题描述】:

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

%% 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;

更短的?

【问题讨论】:

    标签: matlab data-conversion


    【解决方案1】:

    选项 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(:)));
    

    【讨论】:

    • 我仍然面临一个问题:我的直方图是错误的。不输出所有数字
    • @cnn:上面两个选项的结果会有细微的差别。选项 1 将结果的边缘像素保留为 0。选项 2 将通过对原始图像进行零填充来填充它们以执行计算。您必须忽略第一行和最后一行和列,以使两个结果匹配。不过,我不知道这是否是您的直方图问题的根源,因为您没有给我足够的信息来继续。
    • 我已经编辑了上面的代码。我正在使用选项 1.我得到 2.5 x 10^4 of 1s.something myst is wrong...但不知道是什么?
    • @cnn:我不知道可能出了什么问题,尤其是考虑到您不应该能够为 LBP 中的条目获取值 1(最低的非零值应该是2).
    • 对于这个语句,temp = (I2(i-1:i+1,j-1:j+1)> J0).*scale,我得到的值与 scale 相同。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我正在使用 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, [])
      

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

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

      【讨论】:

      • 首先感谢您的回复。其次,当我在 MATLAB 中复制你的函数时,它不起作用。为什么会这样?
      • 我仔细检查过,它工作得很好。你能更具体地说明什么不适合你吗?
      猜你喜欢
      • 2016-03-16
      • 2017-08-07
      • 2020-04-28
      • 2011-01-08
      • 2010-12-08
      • 2015-04-24
      • 2015-10-27
      • 2013-07-27
      相关资源
      最近更新 更多