MATLAB--對於im2bw函數的優化

    由於我在研究的是uint8圖像,所以對於優化im2bw函數的形式爲:im2bw(uint8[], T),不過其它形式也可以由類似思想導出。

測試代碼:遍歷8個圖像得出時間

for n=1:8
    c=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,從我做起。單通道單閾值都有缺陷,對於多通道多閾值無能爲力,慢到炸。不如我自己的算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章