• 机器学习基础篇(3)之图像运算和变换


    目录

    1.图像运算

    1.1 图像的加法运算

    1.2 图像的减法运算

    1.3图像融合

    2.OpenCV的位运算

    2.1 非操作

    2.2 与运算

    2.3 或和异或

    3. 图像的基本变换

    3.1 图像的放大与缩小

    3.2 图像的翻转

     3.3 图像的旋转

    3.4.仿射变换之图像平移仿射

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

    3.6.透视变换

     3.6.1.三个点确定变换矩阵       

      3.6.2.四个点确定变换矩阵   


    1.图像运算

    1.1 图像的加法运算

    • add opencv使用add来执行图像的加法运算

    图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的.就是图像数据相应像素的相加。

    1. # 加法, 加法的效果是加起来如果超过255, 统一变成255
    2. new_img = cv2.add(new_cat, dog)

    1.2 图像的减法运算

    • subtract

    • opencv使用subtract来执行图像的减法运算, 图像对应位置的元素相减, 如果减完小于0, 统一变成0.就是图像数据相应像素的相减。

    1. # 减法
    2. new_img = cv2.subtract(new_cat, dog)

     同样的还有乘法, 除法运算. cv2.mutiply, cv2.divide, 原理是类似的.

    1.3图像融合

    • cv2.addWeighted(src1, alpha, src2, beta, gamma)

    • 图片的融合操作相当于对图片进行线性运算 w1* x1 + w2 * x2 + b. 其中alpha是第一个权重参数, beta是第二个权重参数, gamma是偏差.伽马调整

    1. # 相当于res = new_cat * 0.4 + dog * 0.6 + 0
    2. res = cv2.addWeighted(new_cat, 0.4, dog, 0.6, 0)

    2.OpenCV的位运算

    2.1 非操作

    • bitwise_not(img) 非操作的效果就相当于是用 255 - img

    cat_not = cv2.bitwise_not(cat)

    2.2 与运算

    • bitwise_and(img1, img2) 与运算, 图片对应位置元素进行与操作. 表现出来的效果就是黑和黑与还是黑, 白和白与还是白.

    cat_and_dog = cv2.bitwise_and(new_cat, dog)

    2.3 或和异或

    • bitwise_or 或运算 对应元素做或运算

    • bitwise_xor 异或运算 对应元素做异或运算

    1. #new_img = cv2.bitwise_or(img, img2)
    2. new_img = cv2.bitwise_xor(img, img2)

    3. 图像的基本变换

    3.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. # x,y放大一倍
    2. new_dog = cv2.resize(dog,dsize=(800, 800), interpolation=cv2.INTER_NEAREST)

    3.2 图像的翻转

    • flip(src, flipCode)

      • flipCode =0 表示上下翻转

      • flipCode >0 表示左右翻转

      • flipCode <0 上下 + 左右

     示例代码:

    new_dog = cv2.flip(dog, flipCode=-1)

     3.3 图像的旋转

    rotate(img, rotateCode)

    • ROTATE_90_CLOCKWISE 90度顺时针

    • ROTATE_180 180度

    • ROTATE_90_COUNTERCLOCKWISE 90度逆时针

    示例代码: 

    new_dog = cv2.rotate(dog, rotateCode=cv2.cv2.ROTATE_90_COUNTERCLOCKWISE)

    3.4.仿射变换之图像平移仿射

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

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

    • M:变换矩阵 M是偏移矩阵[1 0 tx,0 1 ty, 0 0 1] 移动后坐标是(x+tx y+ty)

    • dsize: 输出图片大小

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

    • mode: 边界外推法标志

    • value: 填充边界值

    示例代码:

    1. h, w, ch = dog.shape
    2. # M是偏移矩阵[1 0 tx,0 1 ty, 0 0 1] 移动后坐标是(x+tx y+ty)
    3. M = np.float32([[1, 0, 100], [0, 1, 0]])
    4. # 注意opencv中是先宽度, 再高度
    5. new = cv2.warpAffine(dog, M, (w, h))

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

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

    • getRotationMatrix2D(center, angle, scale)

      • center 中心点 , 以图片的哪个点作为旋转时的中心点.

      • angle 角度: 旋转的角度, 按照逆时针旋转.

      • scale 缩放比例: 想把图片进行什么样的缩放.

    示例代码:

    1. h, w, ch = dog.shape
    2. # M = np.float32([[1, 0, 100], [0, 1, 0]])
    3. # 注意旋转的角度为逆时针.
    4. # M = cv2.getRotationMatrix2D((100, 100), 15, 1.0)
    5. # 以图像中心点旋转
    6. M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
    7. # 注意opencv中是先宽度, 再高度
    8. new = cv2.warpAffine(dog, M, (w, h))

    3.6.透视变换

     3.6.1.三个点确定变换矩阵       

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

    • src原目标的三个点

    • dst对应变换后的三个点

    1. # 一般是横向和纵向的点, 所以一定会有2个点横坐标相同, 2个点纵坐标相同
    2. src = np.float32([[200, 100], [300, 100], [200, 300]])
    3. dst = np.float32([[100, 150], [360, 200], [280, 120]])
    4. M = cv2.getAffineTransform(src, dst)
    5. # 注意opencv中是先宽度, 再高度
    6. new = cv2.warpAffine(dog, M, (w, h))

      3.6.2.四个点确定变换矩阵   

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

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

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

    1. src = np.float32([[100, 1100], [2100, 1100], [0, 4000], [2500, 3900]])
    2. dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])
    3. M = cv2.getPerspectiveTransform(src, dst)
    4. new = cv2.warpPerspective(img, M, (2300, 3000))

  • 相关阅读:
    Python3,区区一段代码,自己就可以制作动漫头像,YYDS。
    Redis学习记录------Redis6的事务操作(九)
    【@胡锡进】大模型量化分析- 南京银行 601009.SH
    章鱼网络 Community Call #19|​开启与 Eigenlayer 的合作
    [附源码]计算机毕业设计springboot时间管理软件app
    uni-app学习(1)
    Linux系统firewalld防火墙的应用实操(禁止屏蔽海外国外IP访问)
    基于多尺度卷积神经网络特征融合的植株叶片检测技术
    产品经理基础--04流程图与结构图
    spring学习第四天_Spring Ioc基于注解的形式
  • 原文地址:https://blog.csdn.net/m0_46392035/article/details/125882483