• Python机器视觉--OpenCV入门(重要)--图像的基本变换


    1.OpenCV图像的基本变换

    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, 区域插值, 效果最好, 计算时间最长.
    #缩放狗的图片大小
    dog=cv2.imread('./file_1636622671261/code/dog.jpeg')
    #方式一:按照像素缩放  interpolation 可以指定算法 防止图片失真(一定会存在失真)
    # dog=cv2.resize(dog,(800,800),interpolation=cv2.INTER_BITS)
    #方式二:按照 x,y轴比例进行缩放
    dog=cv2.resize(dog,dsize=None,fx=3.5,fy=3.5,interpolation=cv2.INTER_AREA)
    cv2.imshow('img',dog)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    缩放前

    在这里插入图片描述

    缩放后

    在这里插入图片描述

    1.2 图像的翻转

    • flip(src, flipCode)
      • flipCode =0 表示上下翻转
      • flipCode >0 表示左右翻转
      • flipCode <0 上下 + 左右
    # 翻转
    import cv2
    import numpy as np
    
    #导入图片
    dog = cv2.imread('./dog.jpeg')
    
    new_dog = cv2.flip(dog, flipCode=-1)
    cv2.imshow('dog', new_dog)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    翻转前

    在这里插入图片描述

    翻转后

    在这里插入图片描述

    1.3 图像的旋转

    • rotate(img, rotateCode)
      • ROTATE_90_CLOCKWISE 90度顺时针
      • ROTATE_180 180度
      • ROTATE_90_COUNTERCLOCKWISE 90度逆时针
    # 旋转
    import cv2
    import numpy as np
    
    #导入图片
    dog = cv2.imread('./dog.jpeg')
    
    new_dog = cv2.rotate(dog, rotateCode=cv2.cv2.ROTATE_90_COUNTERCLOCKWISE)
    cv2.imshow('dog', new_dog)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    旋转前

    在这里插入图片描述

    旋转后

    在这里插入图片描述

    2.图像的仿射变换

    2.1 仿射变换之 图像平移

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

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

    • M:变换矩阵

    • dsize: 输出图片大小

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

    • mode: 边界外推法标志

    • value: 填充边界值

    • 平移矩阵

      • 矩阵中的每个像素由(x,y)组成,(x, y)表示这个像素的坐标. 假设沿x轴平移 t x t_x tx​​​​​​​​, 沿y轴平移 t y t_y ty​​​​​​​, 那么最后得到的坐标为 ( x ^ , y ^ ) = ( x + t x , y + t y ) (\hat x, \hat y) = (x + t_x, y + t_y) (x^,y^)=(x+tx,y+ty)​​​​, 用矩阵表示就是:
        ( x ^ y ^ 1 ) = ( 1 0 t x 0 1 t y 0 0 1 ) ( x y 1 ) \left(
        x^y^1" role="presentation" style="position: relative;">x^y^1
        \right) = \left(
        10tx01ty001" role="presentation" style="position: relative;">10tx01ty001
        \right)\left(
        xy1" role="presentation" style="position: relative;">xy1
        \right)
        x^y^1 = 100010txty1 xy1
    #旋转狗的图片
    dog=cv2.imread('./file_1636622671261/code/dog.jpeg')
    #获取原始图片的大小
    h,w,ch=dog.shape
    #获取变换矩阵 以点100,100为中心 旋转 15度 缩放比例为1
    M=cv2.getRotationMatrix2D((100,100),15,1)
    #放射变化
    dog=cv2.warpAffine(dog,M,dsize=(w,h))
    cv2.imshow('img',dog)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    平移前

    在这里插入图片描述

    平移后

    在这里插入图片描述

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

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

    • getRotationMatrix2D(center, angle, scale)
      • center 中心点 , 以图片的哪个点作为旋转时的中心点.
      • angle 角度: 旋转的角度, 按照逆时针旋转.
      • scale 缩放比例: 想把图片进行什么样的缩放.
    # 仿射变换之平移
    import cv2
    import numpy as np
    
    #导入图片
    dog = cv2.imread('./dog.jpeg')
    
    h, w, ch = dog.shape
    # M = np.float32([[1, 0, 100], [0, 1, 0]])
    
    # 注意旋转的角度为逆时针.
    # M = cv2.getRotationMatrix2D((100, 100), 15, 1.0)
    # 以图像中心点旋转 M则为计算后的变换矩阵
    M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
    # 注意opencv中是先宽度, 再高度
    new = cv2.warpAffine(dog, M, (w, h))
    
    cv2.imshow('new', new)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • getAffineTransform(src[], dst[]) 通过三点可以确定变换后的位置, 相当于解方程, 3个点对应三个方程, 能解出偏移的参数和旋转的角度.

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

    请添加图片描述

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

    2.3 仿射变换之 图片的透视变换

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

    img=cv2.imread('./file_1636622671261/code/cat.jpeg')
    print(img.shape)
    #获取变换矩阵
    ori_point=np.float32([[10,10],[210,110],[0,350],[250,390]])
    res_point=np.float32([[20,15],[230,110],[20,300],[300,350]])
    M=cv2.getPerspectiveTransform(ori_point,res_point)
    
    img2=cv2.warpPerspective(img,M,dsize=(640,480))
    cv2.imshow('img',img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    变斜前:

    在这里插入图片描述

    变斜后

    在这里插入图片描述

  • 相关阅读:
    【C++】C++学习(一)
    智慧公厕:城市公共厕所的未来之路
    ABBYY FineReader2023最新版本OCR文字识别软件PDF
    Notion——构建个人知识库
    删除元素(带过渡动画)
    【雷神笔记本快捷键】雷神笔记本FN功能快捷键大全以及电脑CPU处于低功耗但电脑风扇高速转动噪音较大解决方案
    pg ash自制版 pg_active_session_history
    人工智能应用加速落地,推动券商业务+IT双升级|爱分析报告
    大学生数学建模赛题解析及优秀论文-2021电工杯A题高铁牵引供电系统运行数据分析及等值建模(附Python代码)
    Java面试题-Java核心基础-第七天(String)
  • 原文地址:https://blog.csdn.net/qq_43944517/article/details/126322940