OpenCV计算机视觉(三) —— 图像的几何变换

图像的几何变换主要包括图像的翻转、平移、旋转、透视以及一些镜像变换。主要是对图像的大小、位置、坐标进行操作,来实现图片的几何变换。

思维导图如下:

OpenCV计算机视觉(三) —— 图像的几何变换_第1张图片

下面将针对这五个方面进行一一讲解。

图像的翻转

主要通过cv.flip()实现图像的翻转,主要包括X轴翻转,Y轴翻转以及XY轴翻转。

cv.flip(src,flipCode,dst=None)

src:原始图像

dst:代表与原始图像具有同样大小,同样通道数的目标图像

flipCode:旋转类型具体有三个:

0:绕X轴翻转          正数:绕Y轴翻转          负数:绕Y轴翻转

具体实现代码如下:

import cv2 as cv

img = cv.imread('zzf3.jpg')
img = cv.resize(img, (800, 500))
cv.imshow('zzf3', img)

# 绕X轴翻转
img1 = cv.flip(img, 0)
cv.imshow('flip_X', img1)

# 绕Y轴翻转
img2 = cv.flip(img, 1)
cv.imshow('flip-Y', img2)

# 绕XY轴翻转
img3 = cv.flip(img, -1)
cv.imshow('flip_XY', img3)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下图:

可以看出flip()实现了对原图的X轴、Y轴、XY轴的翻转。张子枫小妹妹真可爱!

图像的平移

通过cv.warpAffine()实现图像的平移,具体用法见:(16条消息) OpenCV-Python计算机视觉函数_一只会飞的猪️的博客-CSDN博客

OpenCV计算机视觉(三) —— 图像的几何变换_第2张图片

平移图像的位置通过对原图像与平移矩阵相乘决定,由矩阵可以看出,新图像的x,y坐标分别为:

X = a1x+a2y+a3          Y = a4x+a5y+a6 

例如我们想向右平移50个像素,向下平移80个像素平移矩阵就为:

 

废话不多说,上代码:

import cv2 as cv
import numpy as np

img = cv.imread('zzf5.jpg')
img = cv.resize(img, (800, 500))
cv.imshow('zzf3', img)

M = np.float32([[1, 0, 50], [0, 1, 80]])

img2 = cv.warpAffine(img, M, (800, 500))
cv.imshow('warpAffine.zzf3', img2)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:

可以看出,对图像进行了平移操作。要注意的是,cv,,waapAffine()里面必须传递输出图片的大小dsize,不然会报错。

图像的旋转

图像的旋转在我看来就是构建一个映射矩阵然后使用平移,将原图的点映射到对应的位置。主要使用cv.getRotationMatrix2D()构建映射矩阵,然后通过cv.warpAffine()实现位置变换,达到图像旋转的要求。具体代码如下:

import cv2 as cv


img = cv.imread('ZZF6.jpg')
img = cv.resize(img, None, fx=0.5, fy=0.5)
print(img.shape)

# 构建映射矩阵
M = cv.getRotationMatrix2D((270, 480), 45, 1)

# 实现位置变换
rotation_img = cv.warpAffine(img, M, (960, 540))
cv.imshow('rotation_img', rotation_img)
cv.imshow('zzf6', img)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:

OpenCV计算机视觉(三) —— 图像的几何变换_第3张图片

大家要注意这个print(img.shape)输出的图片尺寸与dsize里面的相反,因为shape显示的是RGB的值,而OpenCV,默认的是BGR,所以相反。

图像的透视

图像的透视变换思路与旋转有点像,主要是修复倾斜的图像和实现图片的倾斜。主要使用cv.getPerspectiveTransform()构建透视矩阵,然后用cv.warpPerspective()进行透视位置的变换。代码如下:

import cv2 as cv
import numpy as np

'读取原始图像'
img = cv.imread('zzf7.jpg')
img = cv.resize(img, None, fx=0.5, fy=0.5)
print(img.shape)

pts1 = np.float32([[0, 0], [600, 0], [0, 960], [600, 960]])
pts2 = np.float32([[0, 100], [510, 0], [100, 760], [500, 740]])

'生成透视矩阵'
M = cv.getPerspectiveTransform(pts1,pts2)

'平移透视'
dst = cv.warpPerspective(img, M, (960, 600))
cv.imshow('w0', img)
cv.waitKey(0)
cv.imshow('w1', dst)
cv.waitKey(0)

运行结果如下图:

OpenCV计算机视觉(三) —— 图像的几何变换_第4张图片可以看出来透视变换和旋转变换还是有区别的 ,两个函数的具体用法大家可以看我的第一篇博客,也可以去网上查函数的参数。

图像的镜像

图像的镜像我主要是通过交换图像中的像素点来实现的,可以分为水平镜像,垂直镜像与对角镜像。具体代码如下:

'''
    通过cv.deepcopy()实现图形的复制
'''
import cv2 as cv
import copy
img = cv.imread('zzf.jpg')
img = cv.resize(img, None, fx=0.3, fy=0.3)
print(img.shape)
size = img.shape
cv.imshow('lovely', img)


'实现水平镜像 高度上的像素点不变,将宽度上的像素点交换'
img1 = copy.deepcopy(img)
h = size[0]  # 图片的宽
w = size[1]  # 图片的长
for i in range(h):
    for j in range(w):
        img1[i, w-1-j] = img[i, j]
cv.imshow('shuiping', img1)


'实现垂直镜像 高度上的像素点交换,不改变宽度上的像素点'
img2 = copy.deepcopy(img)
h = size[0]
w = size[1]
for i in range(h):
    for j in range(w):
        img2[h-1-i, j] = img[i, j]
cv.imshow('chuizhi', img2)


'实现对角镜像 ,高度和宽度上的像素点都交换'
img3 = copy.deepcopy(img)
h = size[0]
w = size[1]
for i in range(h):
    for j in range(w):
        img3[h-1-i, w-1-j]=img[i, j]
cv.imshow('duijiao3', img3)
cv.waitKey(0)
cv.destroyAllWindows()


 运行结果如下:

水平镜像只需要把图像左右对称点位置的像素值交换,垂直镜像需要把图片上下对称的像素值交换 ,对角镜像要把图像关于图片中心对称的像素值交换。

总结:该文章主要讲述了如何进行图像变换,以及图像变换的常用操作,翻转、平移、旋转、透视、镜像变换。各个变换由各个变换的用途,需要大家自己去了解,将其运用在实际问题当中。

你可能感兴趣的:(OpenCV计算机视觉,opencv,python,计算机视觉,图像处理,numpy)