错切是在某方向上,按照一定的比例对图形的每个点到某条平行于该方向的直线的有向距离做放缩得到的平面图形。来源于线性代数。
定义
平面的水平和竖直错切
在平面上,水平错切(或平行于X轴的错切)是一个将任一点映射到点的操作,m是固定参数,称为错切因子。
水平错切的效果是将每一点水平移动,移动的长度和该点的纵坐标成比例。若则x轴上方的所有点都向右移动,则x轴上方的所有点都向左移动,x轴下方点移动的方向对应相反,而x坐标轴上的点位置不变。平行于x轴的直线保持不变,其他所有线绕与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 数学
DEF Warp(image,angle):
a=math.tan(angle*math.pi/180.0)
W=意象width
H=int(image.height+W*a)
开本=(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)
效果略。