• OpenCV 06(图像的基本变换)


    一、图像的基本变换

    1.1 图像的放大与缩小

    - resize(src, dsize, dst, fx, fy, interpolation)

      - src: 要缩放的图片
      - dsize: 缩放之后的图片大小, 元组和列表表示均可.
      - dst: 可选参数, 缩放之后的输出图片
      - fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比.
      - interpolation: 插值算法, 主要有以下几种:
        - INTER_NEAREST, 邻近插值, 速度快, 效果差.
        - INTER_LINEAR, 双线性插值,  使用原图中的4个点进行插值. 默认.
        - INTER_CUBIC, 三次插值, 原图中的16个点.
        - INTER_AREA, 区域插值, 效果最好, 计算时间最长.

    1. import cv2
    2. import numpy as np
    3. #导入图片
    4. dog = cv2.imread('./dog.jpeg')
    5. # x,y放大一倍
    6. new_dog = cv2.resize(dog,dsize=(800, 800), interpolation=cv2.INTER_NEAREST)
    7. cv2.imshow('dog', new_dog)
    8. cv2.waitKey(0)
    9. cv2.destroyAllWindows()

    1.2 图像的翻转

    - flip(src, flipCode)
      - flipCode =0 表示上下翻转
      - flipCode >0 表示左右翻转
      - flipCode  <0 上下 + 左右

    1. # 翻转
    2. import cv2
    3. import numpy as np
    4. #导入图片
    5. dog = cv2.imread('./dog.jpeg')
    6. new_dog = cv2.flip(dog, flipCode=-1)
    7. cv2.imshow('dog', new_dog)
    8. cv2.waitKey(0)
    9. cv2.destroyAllWindows()

    1.3 图像的旋转

    - rotate(img, rotateCode)
      - ROTATE_90_CLOCKWISE 90度顺时针
      - ROTATE_180 180度
      - ROTATE_90_COUNTERCLOCKWISE 90度逆时针

    1. # 旋转
    2. import cv2
    3. import numpy as np
    4. #导入图片
    5. dog = cv2.imread('./dog.jpeg')
    6. new_dog = cv2.rotate(dog, rotateCode=cv2.cv2.ROTATE_90_COUNTERCLOCKWISE)
    7. cv2.imshow('dog', new_dog)
    8. cv2.waitKey(0)
    9. cv2.destroyAllWindows()

    1.4 仿射变换之图像平移

    - 仿射变换是图像旋转, 缩放, 平移的总称.具体的做法是通过一个矩阵和和原图片坐标进行计算, 得到新的坐标, 完成变换. 所以关键就是这个矩阵. 

    - warpAffine(src, M, dsize, flags, mode, value)

    - M:变换矩阵

    - dsize: 输出图片大小

    - flag: 与resize中的插值算法一致

    - mode: 边界外推法标志

    - value: 填充边界值

    - 平移矩阵

    1. # 仿射变换之平移
    2. import cv2
    3. import numpy as np
    4. #导入图片
    5. dog = cv2.imread('./dog.jpeg')
    6. h, w, ch = dog.shape
    7. M = np.float32([[1, 0, 100], [0, 1, 0]])
    8. # 注意opencv中是先宽度, 再高度
    9. new = cv2.warpAffine(dog, M, (w, h))
    10. cv2.imshow('new', new)
    11. cv2.waitKey(0)
    12. cv2.destroyAllWindows()

    1.5 仿射变换之获取变换矩阵

    仿射变换的难点就是计算变换矩阵, OpenCV提供了计算变换矩阵的API

    - getRotationMatrix2D(center, angle, scale)
      - center 中心点 , 以图片的哪个点作为旋转时的中心点.
      - angle 角度: 旋转的角度, 按照逆时针旋转.
      - scale 缩放比例: 想把图片进行什么样的缩放.

    1. # 仿射变换之平移
    2. import cv2
    3. import numpy as np
    4. #导入图片
    5. dog = cv2.imread('./dog.jpeg')
    6. h, w, ch = dog.shape
    7. # M = np.float32([[1, 0, 100], [0, 1, 0]])
    8. # 注意旋转的角度为逆时针.
    9. # M = cv2.getRotationMatrix2D((100, 100), 15, 1.0)
    10. # 以图像中心点旋转
    11. M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
    12. # 注意opencv中是先宽度, 再高度
    13. new = cv2.warpAffine(dog, M, (w, h))
    14. cv2.imshow('new', new)
    15. cv2.waitKey(0)
    16. cv2.destroyAllWindows()

    - getAffineTransform(src[], dst[]) 通过三点可以确定变换后的位置, 相当于解方程, 3个点对应三个方程, 能解出偏移的参数和旋转的角度.

      - src原目标的三个点
      - dst对应变换后的三个点

    1. # 通过三个点来确定M
    2. # 仿射变换之平移
    3. import cv2
    4. import numpy as np
    5. #导入图片
    6. dog = cv2.imread('./dog.jpeg')
    7. h, w, ch = dog.shape
    8. # 一般是横向和纵向的点, 所以一定会有2个点横坐标相同, 2个点纵坐标相同
    9. src = np.float32([[200, 100], [300, 100], [200, 300]])
    10. dst = np.float32([[100, 150], [360, 200], [280, 120]])
    11. M = cv2.getAffineTransform(src, dst)
    12. # 注意opencv中是先宽度, 再高度
    13. new = cv2.warpAffine(dog, M, (w, h))
    14. cv2.imshow('new', new)
    15. cv2.waitKey(0)
    16. cv2.destroyAllWindows()

    1.6 透视变换

    透视变换就是将一种坐标系变换成另一种坐标系. 简单来说可以把一张"斜"的图变"正".

    - warpPerspective(img, M, dsize,....)

    - 对于透视变换来说, M是一个3 * 3 的矩阵.

    - getPerspectiveTransform(src, dst) 获取透视变换的变换矩阵, 需要4个点, 即图片的4个角. 

    1. # 透视变换
    2. import cv2
    3. import numpy as np
    4. #导入图片
    5. img = cv2.imread('./123.png')
    6. print(img.shape)
    7. src = np.float32([[100, 1100], [2100, 1100], [0, 4000], [2500, 3900]])
    8. dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])
    9. M = cv2.getPerspectiveTransform(src, dst)
    10. new = cv2.warpPerspective(img, M, (2300, 3000))
    11. cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    12. cv2.resizeWindow('img', 640, 480)
    13. cv2.namedWindow('new', cv2.WINDOW_NORMAL)
    14. cv2.resizeWindow('new', 640, 480)
    15. cv2.imshow('img', img)
    16. cv2.imshow('new', new)
    17. cv2.waitKey(0)
    18. cv2.destroyAllWindows()

  • 相关阅读:
    最全最小系统板原理图设计实操(涉及电容、电阻选型)
    14:00面试,14:06就出来了,问的问题有点变态。。。
    在Visual Studio2022中同一个项目里写作业,有多个cpp文件会报错
    MySQL中为什么要使用索引合并(Index Merge)
    deb包构建详解
    基础 | 并发编程 - [导论 & volatile]
    Git常用命令1
    一些思考:腾讯股价为何持续都低
    MySQL 主从复制
    2023计算机毕业设计SSM最新选题之java书籍审阅系统dmp8d
  • 原文地址:https://blog.csdn.net/peng_258/article/details/132768135