opencv图像数据增强

1. 图像仿射变换

图像的旋转加上拉升就是图像仿射变换,仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M,这个函数是:

M = cv2.getAffineTransform(pos1, pose2)

其中两个位置就是变换前后的对应位置关系,输出的就是仿射矩阵M,然后再使用cv2.warpAffine()做仿射变换。

import numpy as np

import cv2

image = cv2.imread("abc.jpg")

height, width = image.shape[:2]

bias = np.random.randint(-10, 10, 12)

pts1 = np.float32([[0+bias[0], 0+bias[1]], [width+bias[2], 0+bias[3]], [0+bias[4], height+bias[5]]])

pts2 = np.float32([[0+bias[6], 0+bias[7]], [width+bias[8], 0+bias[9]], [0+bias[10], height+bias[11]]])

M = cv2.getAffineTransform(pts1, pts2)

img_affine = cv2.warpAffine(image, M, (width, height))

2. 图像透视变换

透视变换需要一个3*3变换矩阵,在变换前后要保证直线还是直线。构建此矩阵需要在输入图像中找4个点,以及在输出图像中对应的位置。这四个点中的任意三个点不能共线。

cv2.getPerspectiveTransform(src, dst)

cv2.warpPerspective(img, perspectiveMatrix, (width, height))

bias = np.random.randint(-10, 10, 16)

pts1 = np.float32([[0+bias[0], 0+bias[1]], [height+bias[2], 0+bias[3]], [0+bias[4], width+bias[5]], [height+bias[6], width+bias[7]]])

pts2 = np.float32([[0+bias[8], 0+bias[9]], [height+bias[10], 0+bias[11]], [0+bias[12], width+bias[13]], [height+bias[14], width+bias[15]]])

M = cv2.getPerspectiveTransform(pts1, pts2)

img_perspective = cv2.warpPerspective(image, M, (width, height))

 

3. ThinPlateSpline(TPS薄板样条)

给定两张图片中一些相互对应的关键点,如何能够将其中一张图片形变到另外一张图片上使得这些关键点都对应重合?这就是TPS方法所要解决的问题,TPS可以对表面进行柔性的变形。

Thin Plate Spline(TPS,薄板样条)插值是常用的2D插值方法。它的物理意义是:假设在原形状中有N个点,这N个点在形变之后新坐标之下对应新的N个点。用一个薄钢板的形变来模拟2D形变,确保这N个点能够正确匹配,那么怎样的形变,可以使钢板的弯曲能量最小?TPS插值是这个问题的数值解法。

tps=cv2.createThinPlateSplineShapeTransformer()

sshape = np.array([[0+bias[0],0+bias[1]], [height+bias[2],0+bias[3]], [0+bias[4],width+bias[5]], [height+bias[6], width+bias[7]]], np.float32)

tshape = np.array([[0+bias[8],0+bias[9]], [height+bias[10],0+bias[11]], [0+bias[12],width+bias[13]], [height+bias[14], width+bias[15]]], np.float32)

sshape = sshape.reshape(1,-1,2)

tshape = tshape.reshape(1,-1,2)

matches = list()

matches.append(cv2.DMatch(0,0,0))

matches.append(cv2.DMatch(1,1,0))

matches.append(cv2.DMatch(2,2,0))

matches.append(cv2.DMatch(3,3,0))

tps.estimateTransformation(tshape, sshape, matches)

res = tps.warpImage(image)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值