欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

OpenCV图像处理之七种常用图像几何变换

程序员文章站 2022-03-05 17:52:54
0 程序环境与所学函数本章程序运行需要导入下面三个库,并定义了一个显示图像的函数所学函数##放大、缩小cv.resize(img,dsize,[interpolation])##平移变换m = np....

0 程序环境与所学函数

本章程序运行需要导入下面三个库,并定义了一个显示图像的函数

所学函数

##放大、缩小
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)

1 裁剪、放大、缩小

读入图像

img =  cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

OpenCV图像处理之七种常用图像几何变换

裁剪:数组选择方法(冒号)

#裁剪
rabbit = img[150:450:] #限定行数,列数和三通道
show(rabbit)

显示

OpenCV图像处理之七种常用图像几何变换

放大和缩小:resize()函数

插值方法

OpenCV图像处理之七种常用图像几何变换

程序实现

#放大缩小
#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]))

显示

OpenCV图像处理之七种常用图像几何变换

2 平移变换

原理、平移矩阵推导

OpenCV图像处理之七种常用图像几何变换

读入图像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

OpenCV图像处理之七种常用图像几何变换

程序实现

# 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)

显示

OpenCV图像处理之七种常用图像几何变换

3 错切变换

原理、错切矩阵推导

OpenCV图像处理之七种常用图像几何变换

OpenCV图像处理之七种常用图像几何变换

读入图像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

OpenCV图像处理之七种常用图像几何变换

水平错切

m = np.array([
    [1,0.2,0],
    [0,1,0]
],dtype=np.float32)
 
img3 = cv.warpaffine(img,m,(533,500))
show(img3)

显示

OpenCV图像处理之七种常用图像几何变换

垂直错切

m = np.array([
    [1,0,0],
    [0.3,1,0]
],dtype=np.float32)
 
img3 = cv.warpaffine(img,m,(333,700))
show(img3)

显示

OpenCV图像处理之七种常用图像几何变换

4 镜像变换

原理、镜像矩阵推导

OpenCV图像处理之七种常用图像几何变换

读入图像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

OpenCV图像处理之七种常用图像几何变换

水平镜像

mx = np.array([
    [-1,0,333],
    [0,1,0]
],dtype = np.float32)
img2 = cv.warpaffine(img,mx,(333,500))  #仿射变换函数
show(img2)

显示

OpenCV图像处理之七种常用图像几何变换

垂直镜像

my = np.array([
    [1,0,0],
    [0,-1,500]
],dtype=np.float32)
 
img3 = cv.warpaffine(img,my,(333,500))
show(img3)

显示

OpenCV图像处理之七种常用图像几何变换

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]))

显示

OpenCV图像处理之七种常用图像几何变换

5 旋转变换

原理、旋转矩阵推导

OpenCV图像处理之七种常用图像几何变换

OpenCV图像处理之七种常用图像几何变换

读入图像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

OpenCV图像处理之七种常用图像几何变换

图像旋转

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图像处理之七种常用图像几何变换

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图像处理之七种常用图像几何变换

opencv内置实现图像旋转函数

img_rotate =cv.rotate(img,cv.rotate_90_counterclockwise)

只能进行90度倍数的旋转

程序实现

# 逆时针旋转90度
img_rotate = cv.rotate(img,cv.rotate_90_counterclockwise)
show(img_rotate)
 

显示

OpenCV图像处理之七种常用图像几何变换

6 透视变换

m = cv.getperspectivetransform(str,dst)

str:原始图像矩阵端点位置,dst:目标图像矩阵位置

img2 = cv.warpperspective(img,m,(w,h))

读入图像

img = cv.imread('pic/parthenon500x750.jpg')
show(img)

显示

OpenCV图像处理之七种常用图像几何变换

程序实现

#在原图中定位四个点,这里找的是柱子前面四个点的大概位置,眼睛观察法找的
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)

显示

OpenCV图像处理之七种常用图像几何变换

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

7 最近邻插值、双线性插值

原理:

OpenCV图像处理之七种常用图像几何变换

最近邻插值图示:

OpenCV图像处理之七种常用图像几何变换

双线性插值图示

OpenCV图像处理之七种常用图像几何变换

读入图像

img = cv.imread('pic/rabbit50x33.jpg')
show(img)

显示

OpenCV图像处理之七种常用图像几何变换

程序实现

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图像处理之七种常用图像几何变换的详细内容,更多关于opencv 图像几何变换的资料请关注其它相关文章!