錯(cuò)切是在某方向上,按照一定的比例對(duì)圖形的每個(gè)點(diǎn)到某條平行于該方向的直線的有向距離做放縮得到的平面圖形。來(lái)源于線性代數(shù)。
定義
平面的水平和豎直錯(cuò)切
在平面上,水平錯(cuò)切(或平行于X軸的錯(cuò)切)是一個(gè)將任一點(diǎn)映射到點(diǎn)的操作,m是固定參數(shù),稱為錯(cuò)切因子。
水平錯(cuò)切的效果是將每一點(diǎn)水平移動(dòng),移動(dòng)的長(zhǎng)度和該點(diǎn)的縱坐標(biāo)成比例。若則x軸上方的所有點(diǎn)都向右移動(dòng),則x軸上方的所有點(diǎn)都向左移動(dòng),x軸下方點(diǎn)移動(dòng)的方向?qū)?yīng)相反,而x坐標(biāo)軸上的點(diǎn)位置不變。平行于x軸的直線保持不變,其他所有線繞與x軸交點(diǎn)轉(zhuǎn)動(dòng)不同的角度;原來(lái)豎直的線則變成斜率的斜線,如此參數(shù),即豎直線傾斜后的轉(zhuǎn)軸傾角,稱為錯(cuò)切角。
如果把點(diǎn)的坐標(biāo)寫成一個(gè)列向量,則錯(cuò)切可以表示成一個(gè)的矩陣和坐標(biāo)的乘積:
豎直錯(cuò)切的操作類似,就是將x和y互換位置。轉(zhuǎn)制矩陣如下:
(未知原因,圖片無(wú)法插入)
經(jīng)過(guò)豎直錯(cuò)切后,原來(lái)豎直的直線不變,其他線繞其與y軸交點(diǎn)旋轉(zhuǎn),原來(lái)水平的線現(xiàn)在變成斜率m的線。
廣義錯(cuò)切
對(duì)于向量空間V和其子空間W,一個(gè)對(duì)于W的錯(cuò)切將變換所有和W平行的向量。
具體來(lái)講,如果V是W和W'的直和,我們把V寫成:那么一個(gè)對(duì)于W的錯(cuò)切L即:
其中M是從W'到W的一個(gè)線性映射。用分塊矩陣表示,則L寫成:
(I M
0 I)
應(yīng)用
我們來(lái)直觀看看錯(cuò)切的效果吧
其數(shù)學(xué)表達(dá)式為:
矩陣變換為:
其中b為tan(a),a為錯(cuò)切角度
好啦,我們還是寫程序來(lái)看看效果吧
import cv
import 數(shù)學(xué)
DEF Warp(image,angle):
a=math.tan(angle*math.pi/180.0)
W=意象width
H=int(image.height+W*a)
開(kāi)本=(W,H)
iWarp=cv.CreateImage(size,image.depth,image.nChannels)
for i in range(image.height):
for j in 值域(image.width):
x=int(i+j*a)
iWarp[x,j]=image[i,j]
回車鍵 iWarp
image=cv.LoadImage('lena.jpg',1)
iWarp1=Warp(image,15)
伏羲殤ShowImage('image',image)
cv.ShowImage('1',iWarp1)
cv.WaitKey(0)
效果略。
參考資料 >