图片的几何变换
1. 图片剪切
python中通过切片的方式就可以截取图片矩阵
import cv2
# 读取图片 cv2读取出的图片都是一个二维矩阵
img = cv2.imread('./lena.jpg', cv2.IMREAD_UNCHANGED)
# 切片 两个点的坐标可以截取图片
# x1:x2,y1:y2
img1 = img[180:250, 180:310]
cv2.imshow('img', img)
cv2.imshow('img1', img1)
cv2.waitKey()
2. 图片镜像处理
import cv2
import numpy as np
img = cv2.imread('./lena.jpg')
# 获取到高度宽度
height, width = img.shape[0:2]
# 创建一个原图两倍宽度的全是0(全黑)的矩阵
new_img = np.zeros((height, width * 2, 3), np.uint8)
# 遍历每一个像素点
for row in range(height):
for col in range(width):
# 前半部分直接赋值原图
new_img[row, col] = img[row, col]
# 后半部分倒序赋值 (水中倒影镜像处理)
new_img[row, width * 2 - col - 1] = img[row, col]
cv2.imshow('img', img)
cv2.imshow('img1', new_img)
cv2.waitKey()
3. 图片缩放
resize方法:
- 参数1为图片矩阵
- 参数2为元组,放大或缩放后的高度和宽度
import cv2
img = cv2.imread('./lena.jpg')
# 获取到高度和宽度
height, width = img.shape[0:2]
# 定义缩放比例
new_height = int(height * 0.5)
new_width = int(width * 0.5)
# 使用cv2的resize方法进行缩放
new_img = cv2.resize(img, (new_height, new_width))
cv2.imshow('img', img)
cv2.imshow('new_img', new_img)
cv2.waitKey()
图片操作原理
在计算机程序中,其实是用矩阵来进行描述的,如果我们想对这张图片进行操作,其实就是要对矩阵进行运算。
常见的变换矩阵:
4. 图片位移
变换矩阵根据上图代入进去运算的
使用warpAffine方法使用变换矩阵
- 参数1为
图片矩阵
- 参数2为
变换矩阵
- 参数3为原图片的
宽度
和高度
组成的元组
import cv2
import numpy as np
img = cv2.imread('./lena.jpg')
# 获取到原图片高度和宽度
height, width = img.shape[0:2]
# 定义缩放比例
new_height = int(height * 1)
new_width = int(width * 1)
# 定义变换矩阵 设置了缩放0.5倍 和 位移缩放的高度宽度的一半
matrixShift = np.float32([
[0.5, 0, width * 0.5 / 2],
[0, 0.5, height * 0.5 / 2]
])
# 使用warpAffine方法来使用变换矩阵
shift_img = cv2.warpAffine(img, matrixShift, (width, height))
cv2.imshow('img', img)
cv2.imshow('shift_img', shift_img)
cv2.waitKey()
5. 图片旋转
cv2给定apigetRotationMatrix2D()
参数1:旋转中心点
参数2:旋转度数
参数3:缩放倍数
import cv2
img = cv2.imread('./lena.jpg')
height, width = img.shape[0:2]
# 定义仿射矩阵
M = cv2.getRotationMatrix2D((width / 2, height / 2), 45, 0.5)
# 使用变换矩阵
new_img = cv2.warpAffine(img, M, (width, height))
cv2.imshow('img', new_img)
cv2.waitKey()
6. 图片仿射变换
- 先定义原图片各顶点的坐标矩阵
左上角
➡左下角
➡右上角
➡右下角
- 定义各顶点仿射到新顶点的坐标矩阵 对应第一步
- 使用
getAffineTransform()
方法组合两个矩阵 - 使用
warpAffine()
方法使用变换矩阵
import numpy as np
import cv2
img = cv2.imread('./img/itheima.jpg')
height, width = img.shape[0:2]
# 定义原图片的左上角 左下角 右上角的顶点坐标
matrixSrc = np.float32([[0, 0], [0, height - 1], [width - 1, 0]])
# 定义各顶点仿射到新的顶点
matrixDst = np.float32([[50, 100], [300, height - 200], [width - 300, 100]])
# 组成变换矩阵
matrixAffine = cv2.getAffineTransform(matrixSrc, matrixDst)
# 使用组成的变换矩阵 达到图片仿射转换
new_img = cv2.warpAffine(img, matrixAffine, (width, height))
cv2.imshow('img', new_img)
cv2.waitKey()
7. 图像金字塔
一幅图片的金字塔是一系列以金字塔形状排列的,分辨率逐步降低,而且源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个种植条件才停止采样
。层级越高,图像越小,分辨率越低。上采样则相反。
- 降低图像的分辨率,我们可以称为下采样
import cv2
# 下采样
cv2.pyrDown(img)
- 提高图像的分辨率,我们可以称为上采样
import cv2
# 上采样
cv2.pyrUp(img)
采样和resize()方法是有区别的:
resize方法把图像缩放,会越来越糊,有马赛克一样的小方块,但是往下采样只是分辨率降低,变得模糊,不会出现小方块,还是可以看得见轮廓。