由于我在研究的是uint8图像,所以对于优化im2bw函数的形式为:im2bw(uint8[], T),不过其它形式也可以由类似思想导出。
测试代码:遍历8个图像得出时间
for n=1:8c=char(str(n));f=imread(c);testtime3%要测试的代码
end
算法一
tic
fR=im2bw(f(:,:,1),235/255);
fG=im2bw(f(:,:,2),20/255);
fB=im2bw(f(:,:,3),39/255);
toc
算法二
tic
fk=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;
但是,但是算法二时间会减少,减少,减少,因为算法二多通道下反而只用计算一次交运算:
tic
fR=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。
tic
fR=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,从我做起。单通道单阈值都有缺陷,对于多通道多阈值无能为力,慢到炸。不如我自己的算法。