MATLAB--对于im2bw函数的优化

来源:互联网 发布:win10 蓝牙共享网络 编辑:程序博客网 时间:2024/05/20 20:46

    由于我在研究的是uint8图像,所以对于优化im2bw函数的形式为:im2bw(uint8[], T),不过其它形式也可以由类似思想导出。

测试代码:遍历8个图像得出时间

for n=1:8    c=char(str(n));    f=imread(c);    testtime3%要测试的代码end

算法一

ticfR=im2bw(f(:,:,1),235/255);fG=im2bw(f(:,:,2),20/255);fB=im2bw(f(:,:,3),39/255);toc


算法二

ticfk=true(1030,1920);fR=uint8(f(:,:,1)-235);fR=fR&fk;fG=uint8(f(:,:,2)-20);fG=fG&fG;fB=uint8(f(:,:,3)-39);fB=fB&fk;toc


分析:

从图中可以看出两者速度几乎相差无几,都为0.008-0.011范围内,那么问题来了,优化到底在哪。

优化(敲黑板):

1 im2bw的用处是将阈值以上的转为1,以下的转为0,但是假若我想要的在阈值以下怎么办,答案是求补集,但是这又是一次计算有木有。而采取算法二不管你取哪个范围都是同样的计算量。

2 对于单通道的阈值来说,两者速度相差无几,但是多通道阈值那就不一定了:

算法一时间会增加,因为要加一次交运算,时间为0.011-0.013:

ff=fR&fG&fB;
但是,但是算法二时间会减少,减少,减少,因为算法二多通道下反而只用计算一次交运算:

ticfR=uint8(f(:,:,1)-235);fG=uint8(f(:,:,2)-20);fB=uint8(f(:,:,3)-39);ff=fR&fG&fB;toc

时间为0.005-0.008,明显减少了(还有这种骚操作大笑)。

3 也是很重要的一点,im2bw只能算单阈值,对于多阈值无能为力,而算法二计算多阈值只需要经过一次变换即可得到结果:

算法一,计算两次阈值,再进行交运算,搞不好还得进行补运算,慢的要死,此处不做测试(代码被删了),时间为2-3倍以上。

算法二,数学变换,采用矩阵运算,时间增幅很小,为0.007-0.010。

ticfR=f(:,:,1);fR=(fR-183).*(223-fR);fG=f(:,:,2);fG=(fG-26).*(40-fG);fB=f(:,:,3);fB=(fB-4).*(18-fB);fR=uint8(fR);fG=uint8(fG);fB=uint8(fB);ff=fR&fG&fB;toc


结果:

拒绝im2bw,从我做起。单通道单阈值都有缺陷,对于多通道多阈值无能为力,慢到炸。不如我自己的算法。

原创粉丝点击