OpenCV图像处理----图片的几何变换

图片的几何变换

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

OpenCV图像处理----图片的几何变换_第1张图片

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

OpenCV图像处理----图片的几何变换_第2张图片

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

OpenCV图像处理----图片的几何变换_第3张图片

图片操作原理

在计算机程序中,其实是用矩阵来进行描述的,如果我们想对这张图片进行操作,其实就是要对矩阵进行运算。

常见的变换矩阵:

OpenCV图像处理----图片的几何变换_第4张图片

4. 图片位移

  • 变换矩阵根据上图代入进去运算的
  • 使用warpAffine方法使用变换矩阵
    1. 参数1为图片矩阵
    2. 参数2为变换矩阵
    3. 参数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()

OpenCV图像处理----图片的几何变换_第5张图片

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. 图像金字塔

一幅图片的金字塔是一系列以金字塔形状排列的,分辨率逐步降低,而且源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个种植条件才停止采样层级越高,图像越小,分辨率越低。上采样则相反。

OpenCV图像处理----图片的几何变换_第6张图片

  • 降低图像的分辨率,我们可以称为下采样
import cv2
# 下采样
cv2.pyrDown(img)
  • 提高图像的分辨率,我们可以称为上采样
import cv2
# 上采样
cv2.pyrUp(img)

采样和resize()方法是有区别的:

resize方法把图像缩放,会越来越糊,有马赛克一样的小方块,但是往下采样只是分辨率降低,变得模糊,不会出现小方块,还是可以看得见轮廓。

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