OpenCV常用的图像几何变换有哪些,怎么操作
Admin 2022-06-22 群英技术资讯 1209 次浏览
今天就跟大家聊聊有关“OpenCV常用的图像几何变换有哪些,怎么操作”的内容,可能很多人都不太了解,为了让大家认识和更进一步的了解,小编给大家总结了以下内容,希望这篇“OpenCV常用的图像几何变换有哪些,怎么操作”文章能对大家有帮助。本章程序运行需要导入下面三个库,并定义了一个显示图像的函数
所学函数
##放大、缩小 cv.resize(img,dsize,[interpolation]) ##平移变换 M = np.array([[...]], dtype=np.float32) cv.warpAffine(img, M, dsize) ##镜像变换 cv.flip(img, 1) # 垂直镜像 cv.flip(img, 0) # 水平镜像 cv.flit(img, -1) # 水平垂直同时进行 ##旋转变换 M = cv.getRotationMatrix2D(center, angle, scale) img_rotate = cv.rotate(img, cv.ROTATE_90_CLOCKWISE) ##透视变换 M = cv.getPerspectiveTransform(src, dst) img = cv.warpPerspective(img, M, dsize)
读入图像
img = cv.imread('pic/rabbit500x333.jpg')
show(img)
显示

裁剪:数组选择方法(冒号)
#裁剪 rabbit = img[150:450:] #限定行数,列数和三通道 show(rabbit)
显示

放大和缩小:resize()函数
插值方法

程序实现
#放大缩小 #cv.resize(img,dsize,[interpolation]) dsize表示大小,[interpolation]是插值方法,可选,有默认值 img2 = cv.resize(img,(500,400)) #放大为宽500高400 #使用定义插值方法 #一般来说放大地话选择LINEAR方法,缩小选择AREA方法 img3 = cv.resize(img,(500,400),interpolation=cv.INTER_NEAREST) show(np.hstack([img2,img3]))
显示

原理、平移矩阵推导

读入图像
img = cv.imread('pic/rabbit500x333.jpg')
show(img)
显示

程序实现
# M = np.array([[...]],dtype=np.float32)
# cv.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))
show(img2)
显示

原理、错切矩阵推导


读入图像
img = cv.imread('pic/rabbit500x333.jpg')
show(img)
显示

水平错切
M = np.array([
[1,0.2,0],
[0,1,0]
],dtype=np.float32)
img3 = cv.warpAffine(img,M,(533,500))
show(img3)
显示

垂直错切
M = np.array([
[1,0,0],
[0.3,1,0]
],dtype=np.float32)
img3 = cv.warpAffine(img,M,(333,700))
show(img3)
显示

原理、镜像矩阵推导

读入图像
img = cv.imread('pic/rabbit500x333.jpg')
show(img)
显示

水平镜像
Mx = np.array([
[-1,0,333],
[0,1,0]
],dtype = np.float32)
img2 = cv.warpAffine(img,Mx,(333,500)) #仿射变换函数
show(img2)
显示

垂直镜像
My = np.array([
[1,0,0],
[0,-1,500]
],dtype=np.float32)
img3 = cv.warpAffine(img,My,(333,500))
show(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]))
显示

原理、旋转矩阵推导


读入图像
img = cv.imread('pic/rabbit500x333.jpg')
show(img)
显示

图像旋转
beta = 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))
show(img2)
显示

opencv内置获取旋转矩阵函数:
M = cv.getRotationMatrix2D(center,angle,scale)
center是旋转中心,angle是旋转角度,scale表示放大还是缩小
用上面函数获取旋转矩阵并实现图像旋转
h,w,c = img.shape #获取图像的高度和宽度,方便后面设置旋转中心 M2 = cv.getRotationMatrix2D((w//2,h//2),45,1) img3 = cv.warpAffine(img,M2,(533,500)) #仿射函数实现 show(img3
显示

opencv内置实现图像旋转函数
img_rotate =cv.rotate(img,cv.ROTATE_90_COUNTERCLOCKWISE)
只能进行90度倍数的旋转
程序实现
# 逆时针旋转90度 img_rotate = cv.rotate(img,cv.ROTATE_90_COUNTERCLOCKWISE) show(img_rotate)
显示

M = cv.getPerspectiveTransform(str,dst)
str:原始图像矩阵端点位置,dst:目标图像矩阵位置
img2 = cv.warpPerspective(img,M,(w,h))
读入图像
img = cv.imread('pic/parthenon500x750.jpg')
show(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.getPerspectiveTransform(str,dst)
img2 = cv.warpPerspective(img,M,(w,h))
show(img2)
显示

应用:车道检测、图片矫正
原理:

最近邻插值图示:

双线性插值图示

读入图像
img = cv.imread('pic/rabbit50x33.jpg')
show(img)
显示

程序实现
img1 = cv.resize(img,(330,500),interpolation=cv.INTER_NEAREST) #最近邻插值 img2 = cv.resize(img,(330,500),interpolation=cv.INTER_LINEAR_EXACT) #精确双线新插值 show(np.hstack([img1,img2]))
显示

可以看出最近邻插值还是比较模糊的,过渡结果没有双线性插值平滑
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的是有关使用python实现图片文字识别功能的内容。小编觉得挺实用的,因此分享给大家做个参考,感兴趣的朋友可以了解看看,接下来一起跟随小编看看吧。
这篇文章主要介绍了tensorflow中的梯度求解及梯度裁剪操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章主要给大家分享python中else的使用,对新手学习和裂解else字句有一定的借鉴价值,感兴趣的朋友可以参考一下,希望大家阅读完这篇文章能有所收获,下面我们一起来学习一下吧。
Python列表什么时候应用,常用操作有哪些?当我们需要存一个数据时,可以直接使用变量,但是,当我们要存储100个,设置更多的时候,变量肯定不行,这时候我们要用啥?此时列表就有它的用武之地了,一次性存储多个数据。
大家好,本篇文章主要讲的是Python循环语句介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008