东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2687|回复: 0
打印 上一主题 下一主题

[OpenCV] Opencv里的图像翻转,平移,旋转,缩放,仿射及透视功能

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14435
QQ
跳转到指定楼层
楼主
发表于 2019-12-16 10:56:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
Opencv里的图像翻转,平移,旋转,缩放,仿射及透视功能


cv2.flip() # 图像翻转
cv2.getRotationMatrix2D() #取得旋转角度的Matrix
cv2.GetAffineTransform(src, dst, mapMatrix) #取得图像仿射的matrix
cv2.warpAffine() #图像仿射
cv2.getPerspectiveTransform(src, dst) #取得图像透视的matrix
cv2.warpPerspective() #图像透视


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


# flipCode==0垂直翻转(沿X轴翻转),
# flipCode>0水平翻转(沿Y轴翻转),
# flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)

  1. image = cv2.imread("ai111.vip.jpg")
  2. # Flipped Horizontally 水平翻转
  3. h_flip = cv2.flip(image, 1)
  4. # Flipped Vertically 垂直翻转
  5. v_flip = cv2.flip(image, 0)
  6. # Flipped Horizontally & Vertically 水平垂直翻转
  7. hv_flip = cv2.flip(image, -1)
  8. # flipCode==0垂直翻转(沿X轴翻转),
  9. # flipCode>0水平翻转(沿Y轴翻转),
  10. # flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)
  11. plt.figure(figsize=(16,16))

  12. plt.subplot(221)
  13. # ::-1  本来是BGR 现在倒过来就是RGB
  14. plt.imshow(image[:,:,::-1])
  15. plt.title('original')

  16. plt.subplot(222)
  17. plt.imshow(h_flip[:,:,::-1])
  18. plt.title('horizontal flip')

  19. plt.subplot(223)
  20. plt.imshow(v_flip[:,:,::-1])
  21. plt.title(' vertical flip')

  22. plt.subplot(224)
  23. plt.imshow(hv_flip[:,:,::-1])
  24. plt.title('h_v flip')
  25. # 调整子图间距
  26. # plt.subplots_adjust(wspace=0.5, hspace=0.1)
  27. plt.subplots_adjust(top=0.8, bottom=0.38, left=0.10, right=0.95, hspace=0,
  28.                     wspace=0.35)
  29. plt.show()
复制代码



图像平移,旋转,缩放 仿射变换  cv2.warpAffine()


  1. img = cv2.imread('ai111.vip.jpg')
  2. rows,cols = img.shape[:2]

  3. # 定义平移矩阵,需要是numpy的float32类型
  4. # x轴平移200,y轴平移100, 2*3矩阵
  5. M = np.float32([[1, 0, 200], [0, 1, 100]])
  6. # 用仿射变换实现平移
  7. img_shift = cv2.warpAffine(img, M, (cols, rows), borderValue=(0, 0, 255))

  8. # 第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例, 生成一2*3的矩阵
  9. M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
  10. M1 = cv2.getRotationMatrix2D((cols/2,rows/2),180,1)
  11. M2 = cv2.getRotationMatrix2D((cols/2,rows/2),60,1)
  12. M3 = cv2.getRotationMatrix2D((cols/2,rows/2),60,0.5)
  13. print(M)
  14. '''
  15. [[ 6.123234e-17  1.000000e+00  1.500000e+02]
  16. [-1.000000e+00  6.123234e-17  6.500000e+02]]
  17. '''
  18. #第三个参数:变换后的图像大小 宽度,高度
  19. img_rotat90 = cv2.warpAffine(img,M,(cols,rows))
  20. img_rotat180 = cv2.warpAffine(img,M1,(cols,rows))
  21. img_rotat60 = cv2.warpAffine(img,M2,(cols,rows), borderValue=(255, 0, 0))
  22. img_rotat60_scale = cv2.warpAffine(img,M3,(cols,rows))

  23. plt.figure(figsize=(16,16))
  24. plt.subplot(321)
  25. plt.imshow(img[:,:,::-1])

  26. plt.subplot(322)
  27. plt.imshow(img_shift[:,:,::-1])

  28. plt.subplot(323)
  29. plt.imshow(img_rotat90[:,:,::-1])

  30. plt.subplot(324)
  31. plt.imshow(img_rotat180[:,:,::-1])

  32. plt.subplot(325)
  33. plt.imshow(img_rotat60[:,:,::-1])

  34. plt.subplot(326)
  35. plt.imshow(img_rotat60_scale[:,:,::-1])

  36. # plt.subplots_adjust(top=0.8, bottom=0.08, left=0.10, right=0.95, hspace=0,
  37. #                     wspace=0.35)
  38. plt.subplots_adjust(top=0.8, bottom=0.38, left=0.10, right=0.95, hspace=0,
  39.                     wspace=0.35)
  40. plt.show()
复制代码



图像的旋转加上拉升就是图像仿射变换,仿射变化也是需要一个M矩阵就可以,
但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,
opencv提供了根据变换前后三个点的对应关系来自动求解M。
这个函数是M=cv2.getAffineTransform(pos1,pos2),其中两个位置就是变换前后的对应位置关系。
输出的就是仿射矩阵M。然后在使用函数cv2.warpAffine()
  1. img = cv2.imread('ai111.vip.jpg')
  2. rows,cols = img.shape[:2]
  3. pts1 = np.float32([[50,50],[200,50],[50,200]])
  4. pts2 = np.float32([[10,100],[200,20],[100,250]])
  5. M = cv2.getAffineTransform(pts1,pts2)
  6. print('仿射变换需要的矩阵shape:', M.shape, M)
  7. #第三个参数:变换后的图像大小 宽高互调了
  8. res = cv2.warpAffine(img,M,(rows,cols))

  9. plt.figure(figsize=(8, 8))
  10. plt.subplot(121)
  11. plt.imshow(img[:,:,::-1])

  12. plt.subplot(122)
  13. plt.imshow(res[:,:,::-1])
  14. print(img.shape, res.shape)
  15. plt.show()
复制代码



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

  1. img=cv2.imread('test4.jpg')
  2. rows,cols,ch=img.shape
  3. pts1=np.float32([[(203, 720), (585, 460), (695, 460), (1127, 720)]])
  4. pts2=np.float32([[(320, 720), (320, 0), (960, 0), (960, 720)]])
  5. M=cv2.getPerspectiveTransform(pts1,pts2)
  6. print('透视变换需要的矩阵shape:', M.shape, M)
  7. # img.shape[1::-1] 这里就是宽高互换啊 warpPerspective格式不同    inter_linear
  8. dst=cv2.warpPerspective(img,M,img.shape[1::-1], flags=cv2.INTER_LINEAR)
  9. plt.figure(figsize=(16,16))
  10. plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('Input')
  11. plt.subplot(122),plt.imshow(dst[:,:,::-1]),plt.title('Output')
  12. plt.show()
复制代码





01.jpg (108.58 KB, 下载次数: 155)

01.jpg

02.jpg (110.41 KB, 下载次数: 154)

02.jpg

03.jpg (44.16 KB, 下载次数: 152)

03.jpg

04.jpg (77.96 KB, 下载次数: 155)

04.jpg

ai111.vip.jpg (32.74 KB, 下载次数: 154)

ai111.vip.jpg

test4.jpg (196.48 KB, 下载次数: 153)

test4.jpg

Opencv里的图像翻转,平移,旋转,仿射及透视功能.ipynb

1.09 MB, 阅读权限: 10, 下载次数: 1

让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-27 07:07 , Processed in 0.193278 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表