图像的几何变换主要包括图像的翻转、平移、旋转、透视以及一些镜像变换。主要是对图像的大小、位置、坐标进行操作,来实现图片的几何变换。
思维导图如下:
下面将针对这五个方面进行一一讲解。
主要通过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博客
平移图像的位置通过对原图像与平移矩阵相乘决定,由矩阵可以看出,新图像的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()
运行结果如下:
大家要注意这个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)
运行结果如下图:
可以看出来透视变换和旋转变换还是有区别的 ,两个函数的具体用法大家可以看我的第一篇博客,也可以去网上查函数的参数。
图像的镜像我主要是通过交换图像中的像素点来实现的,可以分为水平镜像,垂直镜像与对角镜像。具体代码如下:
'''
通过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()
运行结果如下:
水平镜像只需要把图像左右对称点位置的像素值交换,垂直镜像需要把图片上下对称的像素值交换 ,对角镜像要把图像关于图片中心对称的像素值交换。
总结:该文章主要讲述了如何进行图像变换,以及图像变换的常用操作,翻转、平移、旋转、透视、镜像变换。各个变换由各个变换的用途,需要大家自己去了解,将其运用在实际问题当中。