2012-11-19 26 views
0

我最近注意到了我的旋轉算法輸出中的異常僞像。我使用的實現將目標矩陣中點的高密度投影到源圖像上,以計算源像素貢獻的相對比率。這些值被緩存以允許通過展開的循環進行非常快的旋轉。靠近原點的實數舍入導致旋轉僞像

的問題是由舍入行爲引起的,這是最好的,從一維採樣策略的上下文中示出:

如果中心爲0.0和是由0.9在任一方向平移時,它仍然是0時圓形

short(+0.9) == 0 
short(-0.9) == 0 
然而

如果中心爲1.0和是由0.9在任一方向平移,然後

short(+0.1) == 0 
short(+1.9) == 1 

落在withi任何點與原點相距1單位的距離歸因於圓角時的原點 。這導致在源圖像中靠近軸的原點的點的過採樣。解決方案是在執行舍入操作時將浮點座標深度轉換爲 正空間,然後將其翻譯回 之後的原點。

我的問題:有沒有辦法避免這個舍入錯誤而沒有轉化爲正空間?

+0

你應該繞到最近而不是截斷? –

+0

我不明白。 'short'是一個整數。 '0.9'是'0'。 '1.9'是'1'。沒有小數。 – David

+0

你更喜歡第一個或後一個效果? –

回答

4

好像你只需要使用floor功能:

(short)floor(0.9) = 0 
(short)floor(-0.9) = -1 
+0

我錯誤地認爲即使對於負數,地板函數也會趨向零。 –

1

所以答案顯然是使用floor功能。這是一個很好的答案,它會解決你的問題。

它確實給你留下了IEEE浮點數學中(1.0/3.0)*3.0 != 3.0的問題。其實static_cast<short>(floor((1.0/3.0)*3.0)) == 2

在致電floor之前,您可能需要爲您的值添加一個epsilon。而且你可能不想使用C風格的演員陣容,因爲有一個合法的理由來使用C風格的演員陣容(谷歌"do not use C-style casts"以瞭解更多),而且這一點很古怪。

所以,你想是這樣的:

short smart_round(double d, double epsilon=0.00001) { 
    short retval = static_cast<short>(floor(d + epsilon)); 
    return retval; 
} 

它集成了一個epsilon,做了static_cast,並使用floor以其他方式本輪下跌(而不是默認的C/C++的行爲「向零舍入」) 。