ToB企服应用市场:ToB评测及商务社交产业平台

标题: 2.4 OpenCV随手简记(五) [打印本页]

作者: 小小小幸运    时间: 2024-6-9 05:51
标题: 2.4 OpenCV随手简记(五)
一、图像翻转       第一个图像翻转,这个可是制作表情包的利器。        图像翻转在    OpenCV    中调用函数    flip()    实现,原函数如下:      
  1. flip(src, flipCode, dst=None)
复制代码
  
      
         示例如下:            
  1. import cv2 as cv
  2. import matplotlib.pyplot as plt
  3. # 读取图片 由 GBR 转 RGB
  4. img = cv.imread('maliao.jpg')
  5. src = cv.cvtColor(img, cv.COLOR_BGR2RGB)
  6. # 图像翻转
  7. # flipCode 为 0 ,则以 X 轴为对称轴翻转,如果 fliipCode > 0 则以 Y 轴为对称轴翻转,如果
  8. flipCode < 0 则在 X 轴、 Y 轴方向同时翻转。
  9. img1 = cv.flip(src, 0)
  10. img2 = cv.flip(src, 1)
  11. img3 = cv.flip(src, -1)
  12. # plt 显示图形
  13. titles = ['Source', 'Ima1', 'Ima2', 'Ima3']
  14. images = [src, img1, img2, img3]
  15. for i in range(4):
  16. plt.subplot(2, 2, i + 1)
  17. plt.imshow(images[i])
  18. plt.title(titles[i])
  19. plt.xticks([])
  20. plt.yticks([])
  21. plt.show()
复制代码
   

           二、放射变换                             1.图像平移                                 图像平移是通过仿射函数         warpAffine()         来实现的,原函数如下:                     
  1. warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None,
  2. borderValue=None)
复制代码
                在图像平移中我们会用到前三个参数:                          1.          需要变换的原始图像                          2.          移动矩阵         M                          3.          变换的图像大小(如果这个大小不和原始图像大小相同,那么函数会自动通过插值来调整像素间的关系)。                          图像的平移是沿着          x          方向移动          tx          距离,          y          方向移动          ty          距离,那么需要构造移动矩阵         :                        
  1. M = [ [1,0,tx], [0,1,ty]]
复制代码
                  M                     2x3          矩阵,          M           矩阵必须是          float          类型的。                             创建          M          矩阵有如下两种方法:                             (1)          、          M = np.zeros(2,3,np.float32)                             M[0] = [1,0,tx]                             M[1] = [0,1,ty]                             (2)          、           M = np.float32([1,0,tx], [0,1,ty])                             我们通过           Numpy           来产生          M          矩阵(必须是          float          类型的),并将其赋值给仿射函数           warpAffine()           ,下                             面来看个示例:                           
  1. import cv2 as cv
  2. import numpy as np
  3. #读取图片
  4. src = cv.imread('maliao.jpg')
  5. rows, cols = src.shape[:2]
  6. # 定义移动距离
  7. tx = 50
  8. ty = 100
  9. # 生成 M 矩阵
  10. M = np.float32([[1, 0, tx], [0, 1, ty]])
  11. # 平移
  12. dst = cv.warpAffine(src, M, (cols, rows))
  13. # 显示图像
  14. cv.imshow('src', src)
  15. cv.imshow("dst", dst)
  16. # 等待显示
  17. cv.waitKey(0)
  18. cv.destroyAllWindows()
复制代码
         

                                              留意:       warpAffine       函数的第三个参数是输出图像的大小, 这里设置的大小是原图片的大小,所                 以效果会有部门遮挡。                            2.平移的动态演示                   
  1. import cv2 as cv
  2. import numpy as np
  3. import time
  4. #读取图片
  5. src = cv.imread('beauty5.jpeg')
  6. rows, cols = src.shape[:2]
  7. # 定义移动距离
  8. tx = 50
  9. ty = 100
  10. i = 0
  11. while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
  12. # 生成 M 矩阵
  13. M = np.float32([[1, 0, tx+i], [0, 1, ty]])
  14. # 平移
  15. dst = cv.warpAffine(src, M, (cols, rows))
  16. # 显示图像
  17. cv.imshow("dst", dst)
  18. time.sleep(1/190)
  19. i = i+1
  20. cv.destroyWindow("dst")
  21. # 斜下方移动,移出后又返回
  22. import cv2 as cv
  23. import numpy as np
  24. import time
  25. #读取图片
  26. src = cv.imread('beauty5.jpeg')
  27. rows, cols = src.shape[:2]
  28. # 定义移动距离
  29. tx = 0
  30. ty = 0
  31. i = 0
  32. while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
  33. # 生成 M 矩阵
  34. if tx+i>src.shape[1]: # 移出后又返回
  35. i = 0
  36. Tx = tx+i
  37. Ty = ty+i
  38. M = np.float32([[1, 0, Tx], [0, 1, Ty]])
  39. # 平移
  40. dst = cv.warpAffine(src, M, (cols, rows))
  41. # 显示图像
  42. cv.imshow("dst", dst)
  43. time.sleep(1/190)
  44. i = i+1
  45. cv.destroyWindow("dst")
复制代码
      3.图像旋转
               图像旋转主要调用         getRotationMatrix2D()         函数和         warpAffine()         函数实现,绕图像的某一个中心                       点旋转,详细如下:                              M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)                              参数分别为:旋转中心、旋转度数、        scale                              rotated = cv2.warpAffine(src, M, (cols, rows))                              参数分别为:原始图像、旋转参数、原始图像宽高                              图像旋转:设(         x0 , y0         )是旋转后的坐标,(         x , y         )是旋转前的坐标,        ( m , n )        是旋转中心,         a         是旋转 的角度(        顺时针        )        ,        ( left , top )        是旋转后图像的左上角坐标,则公式如下        :                       
  1. import cv2 as cv
  2. #读取图片
  3. src = cv.imread('maliao.jpg')
  4. # 原图的高、宽
  5. rows, cols = src.shape[:2]
  6. # 绕图像的中心旋转
  7. # 参数:旋转中心 旋转度数 scale
  8. M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)
  9. #
  10. dst = cv.warpAffine(src, M, (cols, rows))
  11. # 显示图像
  12. cv.imshow("src", src)
  13. cv.imshow("dst", dst)
  14. # 等待显示
  15. cv.waitKey()
  16. cv.destroyAllWindows()
复制代码
   

           4.图片动态旋转效果                     
  1. # 固定大小旋转
  2. import cv2 as cv
  3. import time
  4. #读取图片
  5. src = cv.imread('beauty5.jpeg')
  6. # 原图的高、宽
  7. 5.4 图像倾斜
  8. rows, cols = src.shape[:2]
  9. i = 1
  10. while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
  11. # 生成 M 矩阵
  12. M = cv.getRotationMatrix2D((cols/2, rows/2), 0+i*30, 0.5) # 0-i*30 反转
  13. # 绕图像的中心旋转
  14. # 参数:旋转中心 旋转度数 scale
  15. dst = cv.warpAffine(src, M, (cols, rows))
  16. i = i+1
  17. # 显示图像
  18. cv.imshow("dst", dst)
  19. time.sleep(1/10) # 时间越短,现象越有趣
  20. cv.destroyWindow("dst")
复制代码
   
  1. # 由小到大旋转
  2. import cv2 as cv
  3. import time
  4. #读取图片
  5. src = cv.imread('beauty5.jpeg')
  6. # 原图的高、宽
  7. rows, cols = src.shape[:2]
  8. i = 1
  9. while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
  10. # 生成 M 矩阵
  11. M = cv.getRotationMatrix2D((cols/2, rows/2), 0+i*20, 0.01*i)
  12. # 绕图像的中心旋转
  13. # 参数:旋转中心 旋转度数 scale
  14. dst = cv.warpAffine(src, M, (cols, rows))
  15. i = i+1
  16. if i == 100:
  17. i = 1
  18. time.sleep(3)
  19. # 显示图像
  20. cv.imshow("dst", dst)
  21. time.sleep(1/30)
  22. cv.destroyWindow("dst")
复制代码
            5.图像倾斜                         
  1. import cv2
  2. import numpy as np
  3. img = cv2.imread("demo.png") # 读取图像
  4. rows = len(img) # 图像像素行数
  5. cols = len(img[0]) # 图像像素列数
  6. p1 = np.zeros((3, 2), np.float32) # 32位浮点型空列表,原图三个点
  7. p1[0] = [0, 0] # 左上角点坐标
  8. p1[1] = [cols - 1, 0] # 右上角点坐标
  9. p1[2] = [0, rows - 1] # 左下角点坐标
  10. p2 = np.zeros((3, 2), np.float32) # 32位浮点型空列表,倾斜图三个点
  11. p2[0] = [50, 0] # 左上角点坐标,向右挪50像素
  12. p2[1] = [cols - 1, 0] # 右上角点坐标,位置不变
  13. p2[2] = [0, rows - 1] # 左下角点坐标,位置不变
  14. M = cv2.getAffineTransform(p1, p2) # 根据三个点的变化轨迹计算出M矩阵
  15. dst = cv2.warpAffine(img, M, (cols, rows)) # 按照M进行仿射
  16. cv2.imshow('img', img) # 显示原图
  17. cv2.imshow('dst', dst) # 显示仿射变换效果
  18. cv2.waitKey() # 按下任何键盘按键后
  19. cv2.destroyAllWindows() # 释放所有窗体
复制代码
      6.透视变换
      
               摄像机斜视拍摄一物体后,形成的图像会发生变形,如果将图像映射到拍摄物体平面上,相称于将相机垂直于拍摄平面,这样就会得到图像的真实外形,由于这种映射相称于将原图重新        透视        到另一个平面,这种称之为“        重投影        ”        。                     
                               上述仿射变换可以将矩形映射成恣意平行四边形,      各边仍保持平行      ;而透视变换可以将矩形映射为       恣意四边形      ,      直线仍保持直线      。       由于不再是平行四边形,需提供四个极点。                 透视变换通过函数      cv2.warpPerspective()      实现,语法为      :               
  1. warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None,
  2. borderValue=None)
  3. '''
  4. dst:透视后的输出图像,dsize决定输出图像大小
  5. src:输入图像
  6. M:3*3变换矩阵
  7. flags:插值方法,默认为INTER_LINEAR
  8. borderMode:边类型,默认为BORDER_CONSTANT
  9. borderValue:边界值,默认为0
  10. '''
复制代码
            透视变换通过函数       cv2.getPerspectiveTransform()       来天生转换矩阵,需输入输入图像和输出图像的                    四个极点的坐标。                        
  1. cv2.getPerspectiveTransform(p1,p2)
  2. # p1,p2分别为原图像4点坐标和新图像4点坐标
复制代码
              手动获取图像极点的直接透视变换                       1        、获取图像四个极点(通过        photoshop        等软件手动获取,或用        python-opencv        程序手动获取)                       2        、形成变换矩阵                       3        、透视变换                           
  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. img = cv2.imread('C:/Users/df/Desktop/pp.png')
  5. H_rows, W_cols= img.shape[:2]
  6. print(H_rows, W_cols)
  7. # 原图中书本的四个角点(左上、右上、左下、右下),获取方法见《鼠标点击图片显示点击点及坐标》
  8. pts1 = np.float32([[124,62], [457,100], [53,576], [559,539]])
  9. #变换后矩阵位置
  10. pts2 = np.float32([[0, 0],[W_cols,0],[0, H_rows],[H_rows,W_cols],])
  11. # 生成透视变换矩阵;进行透视变换
  12. M = cv2.getPerspectiveTransform(pts1, pts2)
  13. dst = cv2.warpPerspective(img, M, (668, 634))
  14. cv2.imshow("original_img",img)
  15. cv2.imshow("result",dst)
  16. cv2.waitKey(0)
  17. cv2.destroyAllWindows()
复制代码
      
  1. import cv2
  2. import numpy as np
  3. img = cv2.imread("pp.png")
  4. print("the shape of the imag is: ",img.shape)
  5. def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
  6. if event == cv2.EVENT_LBUTTONDOWN:
  7. xy = "%d,%d" % (x, y)
  8. print (xy)
  9. cv2.circle(img, (x, y), 1, (255, 0, 0), thickness = -1)
  10. cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
  11. 1.0, (0,0,0), thickness = 1)
  12. cv2.imshow("image", img)
  13. cv2.namedWindow("image")
  14. cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN)
  15. cv2.imshow("image", img)
  16. while(True):
  17. try:
  18. cv2.waitKey(100)
  19. if cv2.getWindowProperty('img',cv2.WND_PROP_VISIBLE) <= 0:
  20. break # 防止直接关闭窗口后的“阻塞”
  21. except Exception:
  22. cv2.destroyWindow("image")
  23. break
  24. cv2.waitKey(0)
  25. #cv2.destroyAllWindow()
复制代码
                  通过创建一个鼠标回调函数,当鼠标变乱发生时执行该函数。鼠标变乱可以是任何与鼠标相关的事         件,如左键向下、左键向上、左键双击等。          它为我们提供了每个鼠标变乱的坐标(         x                  y         )。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4