4.opencv图像几何变换

以上操作将会涉及仿射变换函数:

cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)

参数说明:

  • src:输入图像
  • M:仿射变换矩阵
  • dsize:输出图像的大小
  • flags:插值方式的组合(int类型!)
  • borderMode:边界像素模型(int类型!)
  • borderValue:(重点!)边界填充值;默认情况下为0。

flags:插值方式

  • cv2.INTER_LINEAR,表示线性插值
  • cv2.INTER_NEAREST,最近邻插值
  • cv2.INTER_AREA,区域插值
  • cv2.INTER_CUBIC,三次样条插值 4x4像素邻域
  • cv2.INTER_LANCZOS4,lanczsos插值 8x8像素邻域

一、图像平移

import cv2
import numpy as np

img = cv2.imread("katong.jpeg", cv2.IMREAD_UNCHANGED)
rows, cols = img.shape[:2]
print(img.shape)
print(rows, cols)

# 在x轴方向移动多少(50)距离,在y轴方向移动多少(25)距离
H = np.float32([[1, 0, 50], [0, 1, 25]])

res = cv2.warpAffine(img, H, (cols, rows))  # 注意cols和rows的位置发生了变化

cv2.imshow("origin_picture", img)
cv2.imshow("new_picture", res)

cv2.waitKey(0)
cv2.destroyWindow()

二、图像缩放

主要涉及上采样和下采样,其中上采样是放大图片,目的是为了获得更高的分辨率;降采样时缩小分辨率。

涉及函数:

cv2.resize(src, dsize=None, fx, fy, interpolation)
  • src:原图
  • dsize:输出图像尺寸,与比例因子二选一
  • fx:沿水平轴的比例因子
  • fy:沿垂直轴的比例因子
  • interpolation:插值方式【不同的插值方式对图像的影响不同】
import cv2
import numpy as np

img = cv2.imread("katong.jpeg",cv2.IMREAD_UNCHANGED)
height, width = img.shape[:2]

res1 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
res2 = cv2.resize(img,(int(0.8*width),(int(0.8*height))), interpolation=cv2.INTER_AREA)

cv2.imshow("origin_picture",img)
cv2.imshow("res1",res1)
cv2.imshow("res2", res2)

cv2.waitKey()
cv2.destroyAllWindows()

三、图像旋转

简单的理解就是将图像中所有的像素点都旋转一个相同的角度。

旋转后得到的变换矩阵,然后将变换矩阵传入warpAffine中。

涉及的函数:

cv2.getRotationMatrix2D(center, angle, scale)

参数说明:

  • center:图片的旋转中心
  • angle:旋转角度
  • scale:缩放比例,0.5表示缩小一半
  • 正为逆时针,负为顺时针。
import cv2
import numpy as np

img = cv2.imread("katong.jpeg", cv2.IMREAD_UNCHANGED)
rows, clos = img.shape[:2]
# 参数1:旋转中心,参数2:旋转角度,参数3:缩放因子
# #参数3正为逆时针,负值为正时针
M = cv2.getRotationMatrix2D((rows / 2, clos / 2), 45, 1)  # 返回变换矩阵

res = cv2.warpAffine(img, M, (rows, clos))  # 待处理图像+处理矩阵+输出大小
while (1):
    cv2.imshow("img", img)
    cv2.imshow('res', res)
    if cv2.waitKey(0) & 0xFF == 27:
        break
cv2.destroyAllWindows()

注意:旋转后的图像大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。

四、仿射变换

仿射变换:平移、旋转、缩放、裁剪、反射。

涉及函数:

getAffineTransform(pos1,pos2)
  • pos1:表示变换前的位置
  • pos2:表示变换后的位置
import cv2
import numpy as np

img = cv2.imread("katong.jpeg",cv2.IMREAD_UNCHANGED)
rows, cols = img.shape[:2]

# 设置图像仿射变换矩阵
pos1 = np.float32([[50,50],[200,50],[50,200]])
pos2 = np.float32([[10,100],[200,50],[100,250]])

# 图像仿射变化,返回变换矩阵
M = cv2.getAffineTransform(pos1,pos2)

# 图像仿射变化
res = cv2.warpAffine(img,M,(cols,rows))

# 显示图像
cv2.imshow("original",img)
cv2.imshow("result", res)

cv2.waitKey(0)
cv2.destroyAllWindows()

五、透视变换

本质上就是将图像投影到一个新的视平面。

涉及函数:

cv2.getPerspectiveTransform(pos1, pos2)
  • pos1:表示透视变换前的4个点对应的位置
  • pos2:表示透视变换后的4个点对应的位置
cv2.warpPerspective(src, M, (clos, rows))
  • src:表示原始图像
  • M:表示透视变换矩阵
  • (rows,cols)表示变换后的图像大小,rows表示行数,cols表示列数。
import cv2
import numpy as np

img = cv2.imread("katong.jpeg", cv2.IMREAD_UNCHANGED)
rows, clos = img.shape[:2]
# print(rows, clos)
# 设置图像透视变化矩阵
pos1 = np.float32([[114, 82], [287, 156], [8, 100], [143, 177]])
pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])
# 将图像投影到一个新的视平面 ===> 返回变化矩阵
M = cv2.getPerspectiveTransform(pos1, pos2)

# 推向透视变换
result = cv2.warpPerspective(img, M, (clos, rows))
cv2.imshow("original", img)
cv2.imshow("res", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

综合案列:数据扩展===>数据增强

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
img = cv2.imread("katong.jpeg", cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 图像平移
M = np.float32([[1, 0, 80], [0, 1, 30]])
rows, cols, channel = img.shape
img1 = cv2.warpAffine(img, M, (cols, rows))

# 图像缩小
img2 = cv2.resize(img, (200, 200))

# 图像放大
img3 = cv2.resize(img, None, fx=1.1, fy=1.1)

# 绕图像的中心旋转
rows, cols, channel = img.shape
# 函数参数:旋转中心、旋转角度、尺寸
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 30, 1)
# 参数说明:图像、变化矩阵、输出大小
img4 = cv2.warpAffine(img, M, (cols, rows))

# 图像翻转:参数=0以X轴为对称轴翻转;参数=1以Y轴为对称轴翻转
img5 = cv2.flip(img, 0)
img6 = cv2.flip(img, 1)

# 图像仿射变化
pos1 = np.float32([[50, 50], [200, 50], [50, 200]])
pos2 = np.float32([[10, 100], [200, 50], [100, 250]])
M = cv2.getAffineTransform(pos1, pos2)
img7 = cv2.warpAffine(img, M, (rows, cols))

# 图像透射
pos1 = np.float32([[56, 65], [238, 52], [28, 237], [239, 240]])
pos2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]])
M = cv2.getPerspectiveTransform(pos1, pos2)
img8 = cv2.warpPerspective(img, M, (200, 200))

# 循环显示
titles = ['source', 'shift', 'reduction', 'enlarge', 'rotation', 'flipX', 'flipY', 'affine', 'transmission']
images = [img, img1, img2, img3, img4, img5, img6, img7, img8]
for i in range(9):
    plt.subplot(3, 3, i + 1)  # 3x3的方格中的第i个图
    plt.imshow(images[i])
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])  # 隐藏刻度
plt.show()

pytorch中的数据增强:https://blog.csdn.net/MasterCayman/article/details/118557776

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值