[快速閱讀十] 浮點數據的中值模糊及其優化方法。
昨天實現了16位unsigned short數據的高效中值模糊算法,后面就在想其實我還有一個中值算法一直沒有想到好的解決方案,那就是浮點數的中值,這個在某些場合還是有較高的應用價值的。
同樣,3*3或者5*5的浮點中值可以直接實現,而且效率一樣非常高。
其他半徑的了,怎么辦,浮點數嘛,不能使用直方圖,而且數據范圍也很廣,不像8位或者16位數據范圍都是有限的。這兩個問題我一直沒有想到解決之道。
在【16位RAW圖像處理五】任意位深16位圖像的中值模糊快速實現及其應用 一文中看到了解析了Gimp的median_blur實現,文章最后我們提到了GIMP里用了排序獲取局部圖像的實際使用的色階數以及對原始色階做壓縮處理,在哪里這個壓縮主要是為了提高速度,一切看起來都是那么的自然,我在文章里提了另外一個不用排序就可以快速的實現同樣功能的方法,從而避免了排序這個較為緩慢的過程。
但是浮點數無法直接使用直方圖進行統計,那個快速方法就無法使用的。
可是,我們如果還是回到排序上去,我們把局部的浮點數進行排序,然后進行同樣的編號,編號后的數據不就是整形數了嗎,如果對這些整形數進行中值計算,得到的中值不就是真正的中值在浮點有序數列中的索引嗎,這樣不就可以借助整形數據的中值算法進行浮點的中值計算了嗎。
同樣舉個例子,10個浮點數,他們的值分別為:
1.2 100.3 2000.2 150.1 100.3 40000.5 350.7 1.2 2000.2 300.6 5000.2
排序去重后,得到的數據序列如下:
1.2 100.3 150.1 300.6 350.7 2000.2 5000.2 40000.5
10個浮點數對應的編號為:
0 1 5 2 1 7 4 0 5 3 6
然后把這個編號理解為需要排序的數據,進行中值排序,得到的中值數據為3,這個3即為索引值,在排序去重的數據列,找到索引為3的值,即300.6作為最終的中值。
這樣,16位排序算法里后續用到的技巧都可以直接用在浮點數上。
問題迎刃而解了。
細節:
1、測試了GIMP提供的排序算法,然后使用標準的qsort排序,似乎GIMP的排序要更快。
2、GIMP里獲取浮點數對應的編號的代碼部分技巧也是不錯的,可以參考參考。
速度測試:
使用隨機生成的浮點數做測試,3072*3072的數據,半徑25,耗時約為1500ms,如果使用多線程,在現在的4個物理核心上普通CPU上,也能有500ms的速度。
使用稍微有點重復數據的數據集做測試,一般大概需要1000ms左右的耗時,開啟線程可以得到300ms的速度。
浙公網安備 33010602011771號