本章程序运行需要导入下面三个库,并定义了一个显示图像的函数
所学函数
##放大、缩小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_clockwi)##透视变换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.imr欢乐一家人ead('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,m马萨达x,(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_counterclockwi)
只能进行90度倍数的旋转
程序实现
# 逆时针旋转90度img_rotate = cv.rotate(img,cv.rotate_90_counterclockwi)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]))
显示
可以看出最近邻插值还是比较模糊的,过渡结果没有双线性插值平滑
以上就是opencv图像处理之七种常用图像几何变换的详细内容,更多关于opencv 图像几何变换的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-04 02:47:08,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/d46904af7ff40b02fe300572098a803d.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:OpenCV图像处理之七种常用图像几何变换.doc
本文 PDF 下载地址:OpenCV图像处理之七种常用图像几何变换.pdf
留言与评论(共有 0 条评论) |