图像仿射

2022-05-28 16:33:14 浏览数 (2)

代码语言:javascript复制
import cv2
import numpy as np
img=cv2.imread('C:/Users/xpp/Desktop/Lena.png')#原始图像
height,width=img.shape[:2]#图像的高度和宽度
rows,cols,ch=img.shape#图像的行和列
x=100#向右平移100个像素
y=200#向下平移200个像素
p1=np.float32([[0,0],[cols-1,0],[0,rows-1]])#平行四边形的左上角,右上角,左下角
p2=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]])#平行四边形的左上角,右上角,左下角
M=np.float32([[1,0,x],[0,1,y]])#图像平移
N=cv2.getRotationMatrix2D((width/2,height/2),45,0.6)#图像旋转
P=cv2.getAffineTransform(p1,p2)#图像仿射
move=cv2.warpAffine(img,M,(width,height))#图像仿射
rotate=cv2.warpAffine(img,N,(width,height))#图像仿射
dst=cv2.warpAffine(img,P,(cols,rows))#图像仿射
cv2.imshow("original",img)
cv2.imshow("move",move)
cv2.imshow("rotation",rotate)
cv2.imshow("result",dst)
cv2.waitKey()
cv2.destroyAllWindows()

算法:图像仿射是图像通过一系列几何变换实现平移、旋转等多种操作。仿射变换保持图像平直性和平行性。平直性是图像经过仿射变换后,直线仍然是直线。平行性是图像经过仿射变换后,平行线仍然是平行线。

变换矩阵(映射矩阵)M实现变换: dst(x, y)= src(M11·x M12·y M·13, M21·x M22·y M·23)

例子:

将原始图像src向右平移100个像素、向下平移动200个像素,对应关系:

dst (x, y)=src (x 100, y 200) 上述表达式补充完整: dst (x, y)=src (1·x 0·y 100, 0·x 1·y 200)

变换矩阵M:

M11=1 M12=0 M13=100 M21=0 M22=1 M23=200

retval=cv2.getRotationMatrix2D(center, angle, scale)

  • 表示旋转中心点
  • angle表示旋转角度,正数表示逆时针旋转,负数表示顺时针旋转
  • scale表示缩放大小

retval=cv2.getAffineTransform(src, dst)

  • src代表输入图像的三个点坐标
  • dst代表输出图像的三个点坐标

dst=cv2.warpAffine(src, M, dsize[, flags[, borderMode[, borderValue]]])

  • src表示输入图像
  • M表示2×3的变换矩阵
  • dsize表示图像大小
  • flags表示插值方法,默认值是INTER_LINEAR
  • borderMode表示边类型,默认值是BORDER_CONSTANT
  • borderValue表示边界值,默认是0

0 人点赞