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

news/2024/7/21 3:53:02 标签: 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()

在这里插入图片描述

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. 参数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()

在这里插入图片描述

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


http://www.niftyadmin.cn/n/740505.html

相关文章

OpenCV图像处理----图像特效

图像融合 按照一定的比例将两张图片融合在一起 addWeighted()方法: 参数1第一张图片矩阵参数2第一张图片矩阵的权重参数3第二张图片矩阵参数4第二张图片矩阵的权重融合之后的偏移量 进行叠加的两张图片宽高应该相同 叠加之后的像素偏移值如果填的话不要填太大,超…

OpenCV图像处理----绘制图形

# 导包并创建全黑数组 import cv2 import numpy as npimg np.zeros((400, 400, 3), np.uint8)线条 line()方法参数: 图片矩阵起始点结束点颜色值(BGR)线条像素线条类型 cv2.line(img, (10, 60), (200, 60), (61, 141, 240), 2, cv2.LINE_AA)矩形 re…

OpenCV图像处理----视频处理和HSV颜色模型

读取视频 cv2.VideoCapture(0)方法参数: 如果参数为路径就是打开该路径的视频如果参数为数字就是摄像头设备的号 一般为0返回video对象 video对象: get()方法 cv2.CAP_PROP_FPS 获取fps cv2.CAP_PROP_FRAME_WIDTH 获取宽度 cv2.CAP_PROP_FRAME_HEIGHT…

OpenCV图像处理----图像的二值化

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。 二值化的原理 import cv2img cv2.imread(img/lena.jpg) # 转为灰度图 new_img cv2.cvtColor(img, cv2.COLOR_BG…

OpenCV图像处理----图片卷积

图片卷积 图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理&…

机器学习----纯手撸线性回归代码

什么是线性回归? 线性回归是利用函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析, 简单来说线性回归其实是试图找到自变量与因变量之间的关系 比如房子的面积和价格: 房子的面积越大,房子的价格就越高 假设房子的面积和价…

机器学习----感知机(神经网络的基础)

什么是感知机? 机器学习中有分类和回归两大问题: 回归预测线性问题,例如房子价格、每一年的降水量 。分类给物体分类,输出之后输出判断是一个香蕉还是一个苹果。 感知机是神经网络的基础 引入问题 颜色越红,形状越圆…

机器学习----PyTorch入门

PyTorch PyTorch是一个开源的python机器学习库 PyTorch的前身是Torch,其底层和Torch框架一样,使用Python重新写了很多内容 更加灵活,支持动态图,是一个以Python优先的深度学习框架,不仅能实现强大的GPU加速&#xff…