图像几何变换
基于2x3矩阵的仿射变换(平移、缩放、旋转、翻转)、基于3x3矩阵的透视变换。
图像平移
opencv实现图像平移
实现图像平移,我们需要定义下面这样一个矩阵,tx和ty分别是x和y方向上平移的距离:
图像平移利用仿射变换函数 cv.warpAffine() 实现
实验
# 图像平移
import numpy as np
import cv2 as cv
img = cv.imread('paojie.jpg')
rows, cols = img.shape[:2]
# 定义平移矩阵,需要是numpy的float32类型
# x轴平移100,y轴平移50
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 用仿射变换实现平移,第三个参数为dst的大小
dst = cv.warpAffine(img, M, (cols, rows))
cv.imshow('shift', dst)
cv.waitKey(0)
cv.destroyAllWindows()
实验结果
图像缩放
opencv中的图像缩放
缩放就是调整图片的大小,使用cv.resize()函数实现图像缩放。可以按照比例缩放,也可以按照指定的大小缩放。
实验
# 图像缩放
import numpy as np
import cv2 as cv
img = cv.imread('paojie.jpg')
# 按照指定的宽度、高度缩放图片
res = cv.resize(img, (132, 150))
# 按照比例缩放,如x,y方向均放大一倍
# res2 = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)
cv.imshow('shrink', res)
# cv.imshow('zoom', res2)
cv.waitKey(0)
cv.destroyAllWindows()
实验结果
实验代码:
import cv2
import numpy as np
# 读入灰度图像
im_path='../paojie_g.jpg'
img = cv2.imread(im_path,0)
# 注意应该先写宽度img.shape[1]*2,再写高度img.shape[0]*2
NN_interpolation = cv2.resize(img,(img.shape[1]*2,img.shape[0]*2),interpolation=cv2.INTER_NEAREST)
BiLinear_interpolation = cv2.resize(img,(img.shape[1]*2,img.shape[0]*2),interpolation=cv2.INTER_LINEAR)
BiCubic_interpolation = cv2.resize(img,(img.shape[1]*2,img.shape[0]*2),interpolation=cv2.INTER_CUBIC)
cv2.imshow('NN_interpolation',NN_interpolation)
cv2.imwrite('NN_interpolation.jpg',NN_interpolation)
cv2.imshow('BiLinear_interpolation',BiLinear_interpolation)
cv2.imwrite('BiLinear_interpolation.jpg',BiLinear_interpolation)
cv2.imshow('BiCubic_interpolation',BiCubic_interpolation)
cv2.imwrite('BiCubic_interpolation.jpg',BiCubic_interpolation)
cv2.waitKey(0)
cv2.destroyAllWindows()
实验结果:
原图 ↑
NN_interpolation x2 ↑
BiLinear_interpolation x2 ↑
BiCubic_interpolation x2 ↑
可以看到,最近邻插值算法放大图像后,目标图像边缘出现了明显的锯齿;而双线性和双三次插值算法没有出现明显的锯齿边缘。
图像旋转
简介
旋转同平移一样,也是用仿射变换实现的,因此也需要定义一个变换矩阵。OpenCV直接提供了 cv.getRotationMatrix2D()函数来生成这个矩阵,该函数有三个参数:
参数1:图片的旋转中心
参数2:旋转角度(正:逆时针,负:顺时针)
参数3:缩放比例,0.5表示缩小一半
实验
# 图像旋转
import numpy as np
import cv2 as cv
img = cv.imread('paojie.jpg')
rows,cols = img.shape[:2]
# 逆时针45°旋转图片并缩小一半,第一个参数为旋转中心
M = cv.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.5)
# img:源图像;M:旋转仿射矩阵;(cols,rows):dst的大小
dst = cv.warpAffine(img, M, (cols, rows))
cv.imshow('rotation', dst)
cv.waitKey(0)
cv.destroyAllWindows()
实验结果
图像翻转
opencv中的图像翻转
dst = cv2.flip(img, 1)
其中,函数中的第二个参数大于0,表示图像水平翻转(沿y轴);第二个参数等于0,表示图像垂直翻转(沿x轴);第二个参数小于0,表示图像既水平翻转,又垂直翻转。
实验
# 图像翻转
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('paojie.jpg')
# 水平翻转
hor = cv.flip(img,1)
# 垂直翻转
ver = cv.flip(img,0)
# 水平垂直翻转
hor_ver = cv.flip(img,-1)
plt.figure(1)
plt.subplot(2,2,1)
plt.imshow(img)
plt.title('Original')
plt.xticks([]),plt.yticks([])
plt.subplot(2,2,2)
plt.imshow(hor)
plt.title('horizontal')
plt.xticks([]),plt.yticks([])
plt.subplot(2,2,3)
plt.imshow(ver)
plt.title('vertical')
plt.xticks([]),plt.yticks([])
plt.subplot(2,2,4)
plt.imshow(hor_ver)
plt.title('horizontal_and_vertical')
plt.xticks([]),plt.yticks([])
plt.show()