OpenCV:图片的几何变换

1.图片缩放

使用cv2.resize方法进行图像的缩放

import cv2
img = cv2.imread('img.jpg', 1)
imgInfo = img.shape # 得到图片的高度、宽度、颜色通道
print(imgInfo)
height, width, mode = imgInfo
# 等比例缩放
datHeight = int(height * 0.5)
datWidth = int(width * 0.5)

# 默认使用双线性差值算法进行缩放
dat = cv2.resize(img, (datWidth, datHeight))
cv2.imshow('image', dat)
cv2.waitKey(0)
(320, 320, 3)

在这里插入图片描述

1.1 最近邻域插值法

新的坐标计算公示如下:

newX = x * (src_rows / target_rows)

比如:现有坐标x(1, 2) src图像有100行,target图像有50行 newX = (1, 2) * 2 = (2, 4)

1.2 双线性插值法

在这里插入图片描述

现在我们有一个点x = (15.2, 22.3), 将这点投影到x轴和y轴,得到A1,A2,B1,B2四个点,我们通过比例来求得四个点的像素大小,如A1 = (15, 22.3), 则s(A1) = s(15, 22) * 20% + s(16, 22) * 80%,其他四个点也是同样的计算道理,然后我们通过x点在A1和A2的比例或者B1和B2的比例来得到x点的像素值: x = s(A1)* 30% + s(A2) * %70, 或者 x = s(B1) * 20% + s(B2) * 80%

图片缩放的基本步骤:

1.获取图片信息
2.创建空白模板
3.重新计算图像坐标
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
imgInfo = img.shape # 得到图片的高度、宽度、颜色通道
print(imgInfo)
height, width, mode = imgInfo
datHeight = int(height * 0.5)
datWidth = int(width * 0.5)
datImage = np.zeros((datHeight, datWidth, 3),np.uint8) # 创建空白模板

for i in range(datHeight):
    for j in range(datWidth):
        iNew = int(i * height / datHeight)
        jNew = int(j * height / datHeight)
        datImage[i, j] = img[iNew, jNew]
cv2.imwrite('img1.jpg', datImage)
cv2.imshow('dat', datImage)
cv2.waitKey(0)
(320, 320, 3)

在这里插入图片描述

2.图片剪切

图片坐标轴:以左上角为原点,横轴为x轴,纵轴为y轴

import cv2
img = cv2.imread('img.jpg', 1)
imgInfo = img.shape
data = img[100:200, 100:300]# 设置纵轴为100-500, 横轴为100-1000
cv2.imshow('image', data)
cv2.waitKey(0)

在这里插入图片描述

3.图片位移

通过使用cv2.warpAffine方法进行图片的位移

该函数的参数如下:

-src: 要进行位移的图像
-M: 变换矩阵
-dsize: 进行位移之后的图像大小
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

matShift = np.float32([[1, 0, 50], [0, 1, 100]])# 转换矩阵
dat = cv2.warpAffine(img, matShift, (height, width))
cv2.imshow('dat', dat)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

计算过程如下:

1.将数组[[1, 0, 25], [0, 1, 50]]转化为俩个矩阵:
     [[1, 0], [0, 1]] -- A
     [[25], [50]] -- B
2.输入图片为C
3.对应每一个像素表坐标(x, y)计算新的像素坐标为:
    A * C + B = [[1 * x + 0 * y], [0 * x + 1 * y]] + [[25], [50]]
           = [[x + 25], [y + 50]]

我们来使用cv2.warpAffine方法将图片缩放0.5倍,只需要将A矩阵里的1换成0.5即可:

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

matScale = np.float32([[0.5, 0, 0], [0, 0.5, 0]])# 转换矩阵
dat = cv2.warpAffine(img, matScale, (int(width / 2), int(height / 2)))
cv2.imshow('dat', dat)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述

下面我们来使用源代码进行图片的位移

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('src', img)
dat = np.zeros(img.shape,np.uint8) # 创建空白模板
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for i in range(0, height):
    for j in range(0, width - 100):
        dat[i, j + 100] = img[i, j]
cv2.imshow('dat', dat)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

4.图片镜像

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1) # 读取图片
cv2.imshow('src', img)
imgInfo = img.shape     # 获得图片信息
height = imgInfo[0]  # 高度
width = imgInfo[1] # 宽度
deep = imgInfo[2] # 颜色通道

newImgInfo = (height * 2, width, deep)  # 镜像图片信息
dat = np.zeros(newImgInfo,np.uint8) # 创建空白模板

for i in range(0, height):
    for j in range(0, width):
        dat[i, j] = img[i, j]
        dat[2 * height - i - 1, j] = img[i, j]
#添加分割线
for i in range(0, width):
    dat[height, i] = (0, 0, 255) # BGR
cv2.imshow('dat', dat)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

5.仿射变换

我们知道3点确定一个平面,仿射变换的原理就是利用原图像和目标图像三个点的位置关系,得到图像的仿射变换矩阵,从而实现将整个图像通过变换矩阵得到目标图像

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1) # 读取图片
cv2.imshow('src', img)
imgInfo = img.shape     # 获得图片信息
height = imgInfo[0]  # 高度
width = imgInfo[1] # 宽度
deep = imgInfo[2] # 颜色通道
# (左上角,左下角,右上角)
matSrc = np.float32([[0, 0], [0, height - 1], [width - 1, 0]])
matDst = np.float32([[50, 50], [100, height - 100], [width - 100, 100]])
# 得到仿射变换矩阵
matAffine = cv2.getAffineTransform(matSrc, matDst) # 

dst = cv2.warpAffine(img, matAffine, (height, width))
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述

6.图像旋转

我们使用cv2.getRotationMatrix2D函数来进行图像的旋转

cv2.getRotationMatrix2D(cneter, angle, scale):

-center: 旋转的中心
-angle: 旋转的角度
-scale: 缩放系数
import cv2
import numpy as np
img = cv2.imread('img1.jpg', 1) # 读取图片
cv2.imshow('src', img)
imgInfo = img.shape     # 获得图片信息
height = imgInfo[0]  # 高度
width = imgInfo[1] # 宽度
deep = imgInfo[2] # 颜色通道
#定义旋转矩阵
matRotate = cv2.getRotationMatrix2D((height * 0.5, width * 0.5), 45, 0.5)
dst = cv2.warpAffine(img, matRotate, (height, width))
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43328040/article/details/109036500