圖像Resize中0.5像素中心對齊的問題


0.5像素對齊的問題

1. 問題提出

在進行圖像縮放時,偶爾會看到一些比較奇怪的代碼,其中有一個就是0.5像素中心對齊的問題,例如在OpenCV線性插值的代碼中有類似如下操作(非源碼,只是舉例):

// 實際代碼
int x=(i+0.5)*m/a-0.5;
int y=(j+0.5)*n/b-0.5;

// 公式計算
int x=i*m/a
int y=j*n/b

2. 原因分析

為什么要先加0.5又減去0.5呢?之前一直認為只是簡單的取整操作,后來多次遇到,於是深入分析了一下,才發現原因:
在進行雙線性插值的時候,通常情況下圖像的原點都選在了左上角,即左上角像素的左上角,但實際訪問的時候,\((0,0)\)卻代表了第一個像素的值。那么對像素訪問的可以按照如下方式來理解。當訪問像素\((i,j)\)的時候,實際上獲取的是以\((i,j)\)為左上角坐標原點的一個像素的值,即實際取值點與對應坐標點有一定偏差。平常使用的時候沒問題,但是當進行圖像縮放的時候,便會出現一些差異,例如:

把一個\(5\times 5\)圖像縮放到\(3\times3\)大小,那么我們看像素對應關系,只看第一行:
\(I_(x,y)\)

\[I_{3\times3}(0,0) = I_{5\times5} (0,0)\\I_{3\times3}(1,0) = I_{5\times5} (\frac{5}{3},0) \\I_{3\times3}(2,0) = I_{5\times5} (\frac{10}{3},0) \]

由於\(I_{3\times3} ,I_{5\times5}\)的一個像素的大小是相同的,坐標表示的像素左上角的起始位置,那么可以得到如下示意圖:

可以看到,按照這種情況,兩張圖並不是中心對齊的,實際會片左上角。那么如何解決這個問題呢:

\[x'= (x+0.5)*s-0.5\\y' =(y+0.5)*s-0.5 \]

即在計算縮放坐標前先加上\((0.5,0.5)\)取中心點坐標,再乘以變換系數,然后再變換回左上角坐標,即減去\((0.5,0.5)\).

\[I_{3\times3}(0,0) = I_{5\times5} (\frac{1}{3},0)\\I_{3\times3}(1,0) = I_{5\times5} (2,0)\\I_{3\times3}(2,0) = I_{5\times5} (\frac{11}{3},0) \]

其基本原理就是先獲取像素中心的坐標,再對該坐標進行縮放,之后再獲取變換后像素左上角位置坐標。

3. Ref


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM