MATLAB中二进制数到十进制数的转换
我在将二进制转换为十进制时遇到了一个问题(看起来很长) 可以换这条线吗MATLAB中二进制数到十进制数的转换,matlab,data-conversion,Matlab,Data Conversion,我在将二进制转换为十进制时遇到了一个问题(看起来很长) 可以换这条线吗 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; 缩短时间?我不确定您在那里做什么,但确实做了您想做的事情?选项1: 简化操作的一种方法是,首先创建一个3乘3的比例因子矩阵(即二的幂),并在循环之前对其进行初始化:
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;
缩短时间?我不确定您在那里做什么,但确实做了您想做的事情?选项1: 简化操作的一种方法是,首先创建一个3乘3的比例因子矩阵(即二的幂),并在循环之前对其进行初始化:
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:
或者,我相信您可以完全删除这两个循环,并用这个调用替换它们,以获得矩阵LBP
:
LBP = nlfilter(I2,[3 3],@(x) sum((x(:) > x(5)).*scale(:)));
我正在使用该函数添加另一个解决方案 它包括将所有滑动窗口放入矩阵的列中,我们使用自定义函数处理这些列,然后将结果重新排列到原始矩阵中。在内部,它使用和函数 以下是一个例子:
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, [])
与的第二个答案相比,请阅读文档中的以下提示:
nlfilter处理大型图像可能需要很长时间。在某些情况下,
colfilt函数可以更快地执行相同的操作
我仍然面临一个问题:我的直方图是错误的。不输出所有的numbers@cnn:上述两个选项的结果将略有不同。选项1将结果的边缘像素保留为0。选项2将通过零填充原始图像来填充它们以执行计算。要使两个结果匹配,必须忽略第一行和最后一行和最后一列。我不知道这是否是你直方图问题的根源,因为你没有给我足够的信息继续。我已经编辑了上面的代码。我使用的是选项1。我得到了2.5 x 10^4的1。我有点不对劲……但我不知道什么是错的?@cnn:我不知道会出什么问题,特别是考虑到你在
LBP
中的一个条目不能得到1的值(最低的非零值应该是2)。对于这个语句,temp=(I2(I-1:I+1,j-1:j+1)>J0)。*scale,我得到的值与scale相同。首先感谢您的回复。其次,当我在MATLAB中复制you函数时,它不起作用。为什么会这样?我仔细检查了一下,效果很好。。你能更具体地说明什么不适合你吗?
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, [])