定義
平面的水平和豎直錯切
在 平面上,水平錯切(或平行於X軸的錯切)是一個將任一點映射到點的操作,是固定參數,稱為錯切因子。
水平錯切的效果是將每一點水平移動,移動的長度和該點的縱坐標成比例。若則軸上方的所有點都向右移動,則軸上方的所有點都向左移動,軸下方點移動的方向對應相反,而坐標軸上的點位置不變。平行於軸的直線保持不變,其他所有線繞與軸交點轉動不同的角度;原來豎直的線則變成斜率的斜線,如此參數,即豎直線傾斜後的傾角,稱為錯切角。
如果把點的坐標寫成一個列向量,則錯切可以表示成一個的矩陣和坐標的乘積:
豎直錯切的操作類似,就是將x和y互換位置。轉制矩陣如下:
(未知原因,圖片無法插入)
經過豎直錯切後,原來豎直的直線不變,其他線繞其與y軸交點旋轉,原來水平的線現在變成斜率m的線。
廣義錯切
對於向量空間V和其子空間W,一個對於W的錯切將變換所有和W平行的向量。
具體來講,如果V是W和W'的直和,我們把V寫成:
那么一個對於W的錯切L即:
其中M是從W'到W的一個線性映射。用分塊矩陣表示,則L寫成:
(I M
0 I)
套用
我們來直觀看看錯切的效果吧
其數學表達式為:
矩陣變換為:
其中b為tan(a),a為錯切角度
好啦,我們還是寫程式來看看效果吧
import cv
import math
def Warp(image,angle):
a = math.tan(angle*math.pi/180.0)
W = image.width
H = int(image.height+W*a)
size = (W,H)
iWarp = cv.CreateImage(size,image.depth,image.nChannels)
for i in range(image.height):
for j in range(image.width):
x = int(i+j*a)
iWarp[x,j] = image[i,j]
return iWarp
image = cv.LoadImage('lena.jpg',1)
iWarp1 = Warp(image,15)
cv.ShowImage('image',image)
cv.ShowImage('1',iWarp1)
cv.WaitKey(0)
效果略。