錯切是在某方向上,按照一定的比例對圖形的每個點到某條平行於該方向的直線的有向距離做放縮得到的平面圖形。
基本介紹
- 中文名:錯切
- 外文名:shear mapping
- 來源:線性代數
定義,平面的水平和豎直錯切,廣義錯切,套用,
定義
平面的水平和豎直錯切
在平面上,水平錯切(或平行於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)
效果略。