苏州网站建设公司有哪些,网站建设培训东莞市,手机移动端网站是什么,深圳 网站制作需要多少钱 网络服务什么是仿射#xff1f; 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后#xff0c;直线仍然是直线#xff1b;平行性是指 图像在完成仿射变换后#xff0c;平行线仍然是平行线。…什么是仿射 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后直线仍然是直线平行性是指 图像在完成仿射变换后平行线仍然是平行线。 OpenCV 中的仿射函数为 cv2.warpAffine()其通过一个变换矩阵映射矩阵M 实现变换 具体为 dst(, ) src(11 12 13, 21 22 23) 如图 5-2 所示可以通过一个变换矩阵 M将原始图像 O 变换为仿射图像 R 因此可以采用仿射函数 cv2.warpAffine()实现对图像的旋转该函数的语法格式如下
dst cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )式中 dst 代表仿射后的输出图像该图像的类型和原始图像的类型相同。
dsize 决定输出图像的实际大小。
src 代表要仿射的原始图像。
M 代表一个 2×3 的变换矩阵。使用不同的变换矩阵就可以实现不同的仿射变换。
dsize 代表输出图像的尺寸大小。
flags 代表插值方法默认为 INTER_LINEAR。当该值为 WARP_INVERSE_MAP 时 意味着 M 是逆变换类型实现从目标图像 dst 到原始图像 src 的逆变换。 borderMode 代表边类型 默认为 BORDER_CONSTANT 。 当 该值为 BORDER_TRANSPARENT 时意味着目标图像内的值不做改变这些值对应原始图像内的异常 值。 borderValue 代表边界值默认是 0。 通过以上分析可知在 OpenCV 中使用函数 cv2.warpAffine()实现仿射变换忽略其可选参数后的语法格式为
dst cv2.warpAffine( src , M , dsize )其通过转换矩阵 M 将原始图像 src 转换为目标图像 dst
dst(, ) src(11 12 13, 21 22 23)因此进行何种形式的仿射变换完全取决于转换矩阵 M。下面分别介绍通过不同的转换矩阵 M 实现的不同的仿射变换。
平移
通过转换矩阵 M 实现将原始图像 src 转换为目标图像 dst dst(, ) src(11 12 13, 21 22 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 中各个元素的值为 M111 M120 M13100 M210 M221 M23200 将上述值代入转换矩阵 M得到 在已知转换矩阵 M 的情况下可以直接利用转换矩阵 M 调用函数 cv2.warpAffine() 完成图像的平移。
实验利用自定义转换矩阵完成图像平移。
import cv2
import numpy as np
imgcv2.imread(lena.png)
height,widthimg.shape[:2]
x100
y200
M np.float32([[1, 0, x], [0, 1, y]])
movecv2.warpAffine(img,M,(width,height))
cv2.imshow(original,img)
cv2.imshow(move,move)
cv2.waitKey()
cv2.destroyAllWindows()运行结果 其中左图是原始图像右图是移动结果图像
旋转
在使用函数 cv2.warpAffine()对图像进行旋转时可以通过函数 cv2.getRotationMatrix2D() 获取转换矩阵。该函数的语法格式为
retvalcv2.getRotationMatrix2D(center, angle, scale)式中 center 为旋转的中心点。 angle 为旋转角度正数表示逆时针旋转负数表示顺时针旋转。 scale 为变换尺度缩放大小。 利用函数 cv2.getRotationMatrix2D()可以直接生成要使用的转换矩阵 M。
例如想要以图像中心为圆点逆时针旋转 45°并将目标图像缩小为原始图像的 0.6 倍则在调用函数 cv2.getRotationMatrix2D()生成转换矩阵 M 时所使用的语句为
Mcv2.getRotationMatrix2D((height/2,width/2),45,0.6)
实验2完成图像旋转
代码
import cv2
import numpy as np
imgcv2.imread(lena.png)
height,widthimg.shape[:2]
Mcv2.getRotationMatrix2D((width/2,height/2),45,0.6)
rotatecv2.warpAffine(img,M,(width,height))
cv2.imshow(original,img)
cv2.imshow(rotation,rotate)
cv2.waitKey()
cv2.destroyAllWindows()其中左图是原始图像右图是旋转结果图像
更复杂的仿射变换
对于更复杂仿射变换OpenCV 提供了 函数 cv2.getAffineTransform()来生成仿射函数 cv2.warpAffine()所使用的转换矩阵 M。该函数的语法格式为
retvalcv2.getAffineTransform(src, dst)式中 src 代表输入图像的三个点坐标。 dst 代表输出图像的三个点坐标。 在该函数中其参数值 src 和 dst 是包含三个二维数组(x, y)点的数组。上述参数通过函数 cv2.getAffineTransform()定义了两个平行四边形。src 和 dst 中的三个点分别对应平行四边形的 左上角、右上角、左下角三个点。函数 cv2.warpAffine()以函数 cv2.getAffineTransform()获取的 转换矩阵 M 为参数将 src 中的点仿射到 dst 中。函数 cv2.getAffineTransform() 对所指定的点完成映射后将所有其他点的映射关系按照指定点的关系计算确定。
实验3完成图像仿射
import cv2
import numpy as np
imgcv2.imread(lena.png)
rows,cols,chimg.shape
#定义三个点
p1np.float32([[0,0],[cols-1,0],[0,rows-1]])print(p1)
#定义三个点的变换位置
p2np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]])
print(p2)
#生成变换矩阵
Mcv2.getAffineTransform(p1,p2)
#进行仿射变换
dstcv2.warpAffine(img,M,(cols,rows))
cv2.imshow(origianl,img)
cv2.imshow(result,dst)
cv2.waitKey()
cv2.destroyAllWindows()首先构造了两个三分量的点集合 p1 和 p2分别用来指代原始图像和目标图像内平行四边形的三个顶点左上角、右上角、左下角。 然后使用 Mcv2.getAffineTransform(p1,p2) 获取转换矩阵 M。接下来 dstcv2.warpAffine(img,M,(cols,rows)) 完成了从原始图像到目标图像的仿射。
运行结果 其中左图是原始图像右图是仿射结果图像