1. 程式人生 > >二維圖像的三角形變換算法解釋

二維圖像的三角形變換算法解釋

相對 還需 接受 矩陣運算 都在 線程 位置 所在 理解

http://blog.csdn.net/aqua_aqua/article/details/407660

對於二維圖像的變形,最簡單直接的方式就是將需要變形的不規則區域進行三角形劃分,使復雜多邊形由1到N個三角形組成,那麽最終的變形動作也就轉化為這些三角形變形。 三角形變形,就是將一個三角形通過某種變換變成另一個三角形,同時也要保證在源三角形中的點能夠正確映射到目標三角形中合適的位置。如下圖所示: 技術分享 圖中△ABC是源三角形,Z點是源三角形中的任意一點。△abc為目標三角形,而z點就是源三角形中Z點的變換後點。很自然這中間就存在一個變換關系f的存在,根據這個變換關系,可以可△ABC中的每個點都在△abc找到合適的位置。這種從源三角形中的點出發,根據變換關系,算目標三角形的點的方式,稱之為正向變換。此種變換的適合於在目標三角形中找出源三角形的某一點,但是對於二維圖像變形,是需要將源三角形區域內的所有像素都映射到目標三角形中,而兩個三角形的形態、大小不可能一樣,所以最終所造成的結果可能是目標三角形中有的像素未接受到映射,形成空洞。 還有一種變換方式是從目標三角形中的點去找其在源三角形中的位置,這稱為逆向變換。對於需要將整個源三角形都映射到目標三角形的情況,這種方式要更適合。因為這樣可以使目標三角形完全被填充,不至於出現空洞。所以本文中采用了這種逆向變換方式。 而上述兩種變換方式也有所通常所采用的方法也是以二維矩形來表示一個坐標點(源坐標或目的坐標),然後經過一系列平移、縮放、錯切變換等矩陣運算,來算出另一映射坐標點(目的坐標或源坐標),雖然其結果比較精確,但是這樣一個過程是相當復雜,且運算量大。另一種近似算法:利用源三角形和目標三角形各個頂點的對應,通過線性插值,算出源和目的每條邊的映射關系,再將相鄰邊上的點進行連接,再次運用線性插值,最後得到了兩三角形內任意點之間的映射對。相對而言,第二種算法運算量要小很多,且容易理解, 以下圖中源三角形△ABC和目標三角形△abc為例,A點的對應點為a,B點對應點為b,C點對應點為c。現在要找出目標三角形△abc中z點在源三角形△ABC的對應的Z點坐標。具體算法: 1. 過d點做水平線,找到其與△abc的兩個交點。設與ab邊交點為e,與ac邊交點f。 2. 根據△ABC與△abc三個頂點的對應關系,算出e、f兩點在△ABC的AB邊和AC邊上的對應點E、F。 3. 最後由z點在ef點連線的位置,可以得到EF點連線上Z點的位置。 在這個算法中只用到了最簡單的線性插值技術和基本的直線到表達式,避免了繁瑣的矩陣運算。在具體的實現過程中,因為是對目標三角形中每點進行填充,所以還運用到了掃描線技術。 技術分享
在具體實現,由代碼表示,此處只是給出了其流程。 a. 對目標三角形abc中的三個點進行某種序列的排序,使其便於以後運算。此處設最高點為a點,依次為b、c點。如出現水平線,則左點在前。 b. 如果目標三角形中存在水平線,則先找到水平線在源三角形的對應線。因為此次變換主要運用提直線的兩點表達式,這個表達式中對於水平的表示需要特殊處理。 c. 從高點a點後下進行水平掃描,每條水平線都會與△abc存在兩個交點,找到這個兩個交點e、f點, d. 根據兩點所在邊與其在△ABC中對應邊的關系,找到源三角形中的E、F點。 e. 對e、f點之間的連線進行遍歷,找到其線上各點在△ABC中EF點連線的位置, f. 找到相應位置也就找到了相應的原始像素,因為在一般情況下找到的原始點坐標都是一個實數,不是整數,所以取原始點的顏色還需要對此位置四周的顏色進行雙線性插值,才能找到最終所需要的顏色。 註意,在對顏色進行線性插值時,要對三原色分別進行插值。 另外,對於大區域的變換時,可以多線程技術,對三角形的區域進行多點同時進行轉換。

二維圖像的三角形變換算法解釋