本文主要介绍OpenCV图像处理中常用的几种几何变换:裁剪、放大、缩小、平移、错切、镜像、旋转、透视等。本文中的样例代码非常详细,有需要的朋友可以参考一下。
目录
0程序环境和学到的函数1剪切、放大和缩小2平移变换3错切变换4镜像变换5旋转变换6透视变换7最近邻插值和双线性插值。
0 程序环境与所学函数
本章运行程序需要导入以下三个库,并定义了一个显示图像的函数。
学习功能
# #放大和缩小
cv.resize(img,dsize,[插值])
# #翻译转换
M=np.array([[.]],dtype=np.float32)
瓦尔帕芬简历(img,M,dsize)
# #镜像转换
Cv.flip(img,1) #垂直镜面
Cv.flip(img,0) #水平镜像
Cv.flit(img,-1) #同时水平和垂直
# #旋转变换
M=cv.getRotationMatrix2D(中心,角度,刻度)
img_rotate=cv.rotate(img,cv。顺时针旋转90度)
# #透视变换
m=cv . getperspective transform(src,dst)
img=cv.warpPerspective(img,M,dsize)
1 裁剪、放大、缩小
读入图像
img=cv . im read( pic/rabbit 500 x333 . jpg )
显示(img)
显示
剪裁:数组选择方法(冒号)
#切
Rabbit=img[150:450:] #限制行数、列数和三个通道数
展示(兔子)
显示
放大和缩小:resize()函数
插值法
程序实现
#放大和缩小
#简历。resize (img,dsize,[interpolation]) dsize表示大小,[interpolation]是一种插值方法,可选,有默认值。
Img2=cv.resize(img,(500,400)) #放大到500宽400高。
#使用定义的插值方法
#一般来说;放大时选择线性法,缩小时选择面积法
img3=cv.resize(img,(500,400),插值=cv。最近的)
show(np.hstack([img2,img3])
显示
2 平移变换
原理和转换矩阵推导
读入图像
img=cv . im read( pic/rabbit 500 x333 . jpg )
显示(img)
显示
程序实现
# M=np.array([[.]],dtype=np.float32)
#简历。Waraffine (img,m,dsize)cv中的图像仿射变换函数,m为上矩阵,dsize为输出图像大小。
M=np.array([
[1,0,100],
[0,1,50]
],dtype=np.float32) #水平向右平移100像素,垂直向下平移50像素。原理见理论部分。
img2=cv.warpAffine(img,M,(333,500))
显示(img2)
显示
3 错切变换
交错矩阵的原理、推导
读入图像
img=cv . im read( pic/rabbit 500 x333 . jpg )
显示(img)
显示
水平交错切割
M=np.array([
[1,0.2,0],
[0,1,0]
],dtype=np.float32)
img3=cv.warpAffine(img,M,(533,500))
显示(img3)
显示
垂直交错切割
M=np.array([
[1,0,0],
[0.3,1,0]
],dtype=np.float32)
img3=cv.warpAffine(img,M,(333,700))
显示(img3)
显示
4 镜像变换
镜像矩阵的原理、推导
读入图像
img=cv . im read( pic/rabbit 500 x333 . jpg )
显示(img)
显示
水平镜像
Mx=np.array([
[-1,0,333],
[0,1,0]
],dtype=np.float32)
Img 2=cv.warpaffine (img,MX,(333,500)) #仿射变换函数
显示(img2)
显示
垂直镜像
My=np.array([
[1,0,0],
[0,-1,500]
],dtype=np.float32)
img3=cv.warpAffine(img,My,(333,500))
显示(img3)
显示
Opencv内置函数实现镜像转换
#垂直镜像cv.flip(img,1)
#水平镜像cv.flip(img,0)
# cv.flip(img,-1)同时水平和垂直
程序实现
Img4=cv.flip(img,1) #垂直镜像
Img5=cv.flip(img,0) #水平镜像
Img6=cv.flip(img,-1) #水平和垂直镜像同时完成。
show(np.hstack([img4,img5,img6])
显示
5 旋转变换
原理和旋转矩阵推导
读入图像
img=cv . im read( pic/rabbit 500 x333 . jpg )
显示(img)
显示
图像旋转
贝塔=np.pi/4
#旋转矩阵
M=np.array([
[np.cos(beta),np.sin(beta),0],
[-np.sin(beta),np.cos(beta),0]
],dtype=np.float32)
img2=cv.warpAffine(img,M,(633,300))
显示(img2)
显示
Opencv内置了旋转矩阵函数:
M=cv.getRotationMatrix2D(中心,角度,刻度)
Center是旋转的中心,angle是旋转的角度,scale表示是放大还是缩小。
使用上述函数获取旋转矩阵,实现图像旋转。
h,w,c=img.shape #获取图像的高度和宽度,方便后期设置旋转中心。
M2=cv . getrotationmatrix 2d((w//2,h//2),45,1)
Img3=cv.warpaffine (img,m2,(533,500)) #仿射函数实现
显示(img3
显示
Opencv内置图像旋转功能
img_rotate=cv.rotate(img,cv。逆时针旋转90度)
只能以90度的倍数旋转。
程序实现
#逆时针旋转90度
img_rotate=cv.rotate(img,cv。逆时针旋转90度)
显示(img_rotate)
显示
6 透视变换
m=cv . getperspective transform(str,dst)
Str:原始图像矩阵的结束位置,dst:目标图像矩阵的位置。
img2=cv.warpPerspective(img,M,(w,h))
读入图像
img=cv . im read( pic/Parthenon 500 x750 . jpg )
显示(img)
显示
程序实现
#定位原图中的四个点。这里我们找到了柱子前面四个点的大概位置。我们通过肉眼观察发现了它们。
str=np.array([
[210,50],
[610,270],
[650,470],
[150,450]
],dtype=np.float32)
#目标图像中的矩阵
dst=np.array([
[150,50],
[650,50],
[650,470],
[150,470]
],dtype=np.float32)
h,w,c=img.shape
#透视变换将类似矩形的图形拉成矩形。
m=cv . getperspective transform(str,dst)
img2=cv.warpPerspective(img,M,(w,h))
显示(img2)
显示
应用:车道检测,图像校正
7 最近邻插值、双线性插值
原则:
最近邻插值图:
双线性插值图
读入图像
img=cv . im read( pic/rabbit 50x 33 . jpg )
显示(img)
显示
程序实现
1=cv.resize (img,(330,500),interpolation=cv . inter _ nearest)#最近邻插值
Img=cv。resize (img,(330,500),插值=cv。精确两条线的新插值
show(np.hstack([img1,img2])
显示
可以看出,最近邻插值是模糊的,过渡结果不如双线性插值平滑。
以下是OpenCV图像的七种常见几何变换的细节。关于OpenCV图像几何变换的更多信息,请关注我们的其他相关文章!