前言:

这里会运用到矩阵的知识,包括矩阵乘法,矩阵的逆。

记得导入模块cv2:import cv2 as cv(这里我为cv2创建了一个别名cv,便于编写)。必要时再导入numpy模块:import numpy as np。(下图中我都做了大小的调整方便观察)

一、图像翻转(图像镜像旋转)

在OpenCV中,图片的镜像旋转是以图像的中心为原点进行镜像翻转的。

cv2.flip(img,flipcode)

  • img: 要翻转的图像

  • flipcode: 指定翻转类型的标志

注意:

  1. flipcode=0: 垂直翻转,图片像素点沿x轴翻转

  2. flipcode>0: 水平翻转,图片像素点沿y轴翻转

  3. flipcode<0: 水平垂直翻转,水平翻转和垂直翻转的结合

1.读图并调整图像大小方便对比效果

2.图像反转

  • 垂直翻转flipcode=0

  • 水平翻转flipcode>0

  • 水平垂直翻转flipcode<0

3.留下绘制时间并销毁窗口释放资源

二、图像仿射变换

仿射变换(Affine Transformation)是一种线性变换,保持了点之间的相对距离不变。

1、仿射变换的基本性质、类型和原理

  1. 基本性质:保持直线、保持平行、比例不变性、不保持角度和长度
  2. 常见的变换类型:旋转(绕某个点或轴旋转一定角度)、平移(仅改变物体的位置,物体大小和形状不改变)、缩放(改变物体的大小)、剪切(使物体发生倾斜变形)
  3. 基本原理:
  • 线性变换
  • 二维空间中,图像点坐标为​,仿射变换的目标是将这些点映射到新的位置 ​。

  • 为了实现这种映射,通常会使用一个矩阵乘法的形式对于图像中的任意一点 (x, y),经过此变换后得到新坐标 (x', y') 。(类似于y=kx+b)

1.1基本原理解释(以单点旋转为例)

1、令旋转中心为坐标系中心O(0,0),假设有一点,离旋转中心O的距离为r,与坐标轴x轴的夹角为,绕O顺时针旋转角后对应的点为​。

则可以得到关系:

    用矩阵来表示:

    但是再OpenCV中,旋转是以图像左上角为旋转中心,且旋转方向与我们认识的顺逆时针相反(即以逆时针旋转为正方向)则,上述矩阵可写为:

    其中为旋转矩阵M,为目标坐标,为原坐标

    2、以任意点为旋转中心时,除了要进行旋转之外,还要进行平移操作,则当点经过平移后得到P点时,如下图:

    则可得到关系:

    用矩阵来表示:

    其中为旋转矩阵M,为目标坐标,为原坐标。

    (这里由于增加了t_x和t_y,为了与坐标匹配,增加了[0,0,1]的向量,同时目标坐标和原坐标都增加了一个1元素)

    1.2图像仿射变换函数

    cv2.warpAffine(img,M,dsize)

    • img:输入图像。

    • M:2x3的变换矩阵,类型为np.float32

    • dsize:输出图像的尺寸,形式为(width,height)

    2、图像旋转

    旋转图像可以将图像绕着某个点旋转一定的角度。

    cv2.getRotationMatrix2D(center,angle,scale)

    • center:旋转中心点的坐标,格式为(x,y)

    • angle:旋转角度,单位为度,正值表示逆时针旋转,反之亦然。

    • scale:缩放比例,若设为1,则不缩放。数值越小图片越小,反之亦然。

    • 返回值:M,2x3的旋转矩阵。

    1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

    2.获取图像旋转中心,并获取图像的旋转矩阵

    3.用仿射变换函数实现旋转

    (这里我设置输出图像尺寸dsize为原图尺寸(w,h))

    4.显示效果并且释放资源

    3、图像平移

    平移操作可以将图像中的每个点沿着某个方向移动一定的距离。

    3.1基本原理:

    假设我们有一个点 ,希望将其沿x轴方向平移n个单位,沿y轴方向平移​个单位到新的位置​,那么平移公式如下:

         矩阵表示为:

    (这里的t_x和t_y分别代表在x轴和y轴上的平移量。[[1, 0, tx], [0, 1, ty]]表示缩放为一,即不变,且分别在y轴和x轴方向做了t_x和t_y的平移量,并且零剪切)

    3.2实际操作

    1.读图并调整图像大小方便对比效果(此处与上述处理相同,省略)

    2.获取图像的高h和宽w

    3.获取平移矩阵

    注意:

    1. 这里用到numpy模块,需要提前导入numpy模块:import numpy as np。
    2. 并且用到np.float32,表示创建一个2×3的仿射变换矩阵,让变换矩阵必须是float32类型的numpy数组,才能运用OpenCV的warpAffine()函数。后续创建矩阵时都会用到,属于很重要的知识点。
    3. 在np.float32()中填写是变换矩阵

    4.用仿射变换函数实现旋转

    5.显示效果并且释放资源

    4、图像缩放

    缩放操作可以改变图片的大小。

    4.1基本原理:

    假设要把图像的宽高分别缩放为0.5和0.8,那么对应的缩放因子sx=0.5,sy=0.8。点​对应到新的位置​,缩放公式为:

    矩阵表示为:

    (这里s_x和s_y分别是x轴和y轴上的缩放因子。[[sx, 0, 0], [0, sy, 0]]表示分别在y轴和x轴上做了缩放因子分别为sx和sy的缩放,并且零平移,零剪切)

    图像缩放会比图像旋转中的等比例缩放灵活很多,因为它可以在指定方向上进行缩放。

    4.2实际操作

    1.读图并调整图像大小方便对比效果(此处与上述处理相同,省略)

    2.获取图像的高h和宽w

    3.定义缩放变换矩阵

    (这里选择缩放因子为sx=0.5,sy=0.8进行缩放)

    4.用仿射变换函数进行缩放

    5.显示效果并释放资源

    5、图像剪切

    剪切操作可以改变图形的形状,以便其在某个方向上倾斜,它将对象的形状改变为斜边平行四边形,而不改变其面积

    5.1基本原理:
    对于二维空间中的点​,对他进行剪切变换:

    沿x轴剪切:​ ​

    沿y轴剪切:​ ​

    当需要同时沿两个方向进行剪切时,​ 

    矩阵表示为:

                 

    (右图中,可以证实原面积xy=剪切后的面积,满足面积不变。并且shy和shx分别对应沿x轴和y轴方向上的剪切因子。[[1,shy,0],[shx,1,0]]分别在y和x轴方向上做了剪切,并且零缩放,零平移。)

    5.2实际操作

    1.读图并调整图像大小方便对比效果(此处与上述处理相同,省略)

    2.获取图像的高h和宽w

    3.定义剪切矩阵

    (这里规定剪切因子分别为0.3和0.2,并且选择在x和y两个方向上都做了剪切)

    4.用仿射变换函数实现图像剪切

    5.显示效果并释放资源

    三、插值方法

    • 在图像处理和计算机图形学中,插值(Interpolation)是一种通过已知数据点之间的推断或估计来获取新数据点的方法。它在图像处理中常用于处理图像的放大、缩小、旋转、变形等操作,以及处理图像中的像素值。
    • 图像插值算法是为了解决图像缩放或者旋转等操作时,由于像素之间的间隔不一致而导致的信息丢失和图像质量下降的问题。当我们对图像进行缩放或旋转等操作时,需要在新的像素位置上计算出对应的像素值,而插值算法的作用就是根据已知的像素值来推测未知位置的像素值。
    • 基本原理:因为当图像进行变换(旋转,缩放,剪切)时,目标位置的像素值往往不是整数坐标,所以需要通过周围已知像素点的值来估算目标位置的像素值。下面所呈现的五种方法就是利用邻近已知点的信息来估算未知点的值。
    • 插值方法可用来计算一些非整数位置的像素值。

    1、最近邻插值(速度快,精度低)

    cv.INTER_NEAREST

    1.1基本原理:

    目标点与原图像点之间坐标的计算公式:

    • srcX/Y表示原图像中的坐标,dstX/Y表示目标图像中的坐标。
    • srcWigth/Height表示原图像的宽度和高度,dstWigth/Height表示目标图像的宽度和高度。

    根据这个公式,我们就可以根据目标图点的坐标找到对应的原图像点的坐标了。

    1.2实际操作(这里用图像旋转为例)

    1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

    2.获取图像旋转中心,并获取图像的旋转矩阵

    3.用仿射变换函数实现图像旋转(最近邻插值方法)

    4.显示效果并释放资源

    2、双线性插值(最常用,默认)

    cv.INTER_LINEAR

    2.1单线性插值法(只需要两个像素点):

    线性插值就是在两个已知点之间进行直线插值的方法。

    给定两个点 (x₁, y₁) 和 (x₂, y₂),要计算 x 处的值 y:y = y₁ + (y₂ - y₁) × (x - x₁) / (x₂ - x₁)

    或者写成权重形式:y = (x₂ - x)/(x₂ - x₁) × y₁ + (x - x₁)/(x₂ - x₁) × y₂

    2.2双线性插值法基本原理:

    1.原理

    双线性插值就是要找到四个最接近原图像点(x,y)的已知像素点,然后再分别在垂直方向和水平方向上做线性插值的方法。

    给定四个点P00(x0, y0), P01(x0, y1), P10(x1, y0), P11(x1, y1),它们构成了一个2*2的矩阵。

    然后分别在水平方向和垂直方向上做线性插值。下面举个例子:

    (修改:图中左下角的为Q11点)

    要计算出中心目标点的插值。由于R1和R2尚未获得,R1需要根据Q11和Q21获得(线性插值),R2需要根据Q12和Q22获得(线性插值),然后再根据R1和R2获得中心目标P的插值。即

    先计算R1和R2的插值:

    再计算P的插值:

    2.优化

    问题1:由图我们可以知道最右面的点都会有概率直接复制到目标图像中(至少原点肯定是这样),而且就算不和原图像中的点重合,也相当于进行了1次单线性插值。但是如果采用不同的坐标系时,结果会发生改变。下面这张图是右上角为坐标系原点的情况。

    问题2:整体的图像相对位置会发生变化。如下图,左侧是原图像(3,3),右侧是目标图像(5,5),原图像的几何中心点是(1,1),目标图像的几何中心点是(2,2),根据公式可以得到目标中心(0,0)对应原图像中的点坐标时(1.2,1.2)。但是目标图像的中心点应该是和原图像中的(1,1)是对应重合的,而得到的对应坐标却偏右下,那么整体的图像的位置信息会偏移。

    优化:因此再OpenCV中为了解决这两个问题,将公式进行了优化:

    在通过这个公式计算出原图中的对应坐标后再进行插值计算就可以避免出现上述的两个问题。

    2.3实际操作

    1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

    2.获取图像旋转中心,并获取图像的旋转矩阵

    3.用仿射变换函数实现图像旋转(双线性插值法)

     4.显示效果并释放资源

    3、像素区域插值

    cv.INTER_AREA

    3.1基本原理:

    像素区域插值主要分为两种情况:缩小图像和放大图像。

    • 当使用像素区域插值方法进行缩小图像时,它就会变成一个均值滤波器(滤波器其实就是一个核,这里只做简单了解,后面实验中会介绍),其工作原理可以理解为对一个区域内的像素值取平均值。

    • 当使用像素区域插值方法进行放大图像时,如果图像放大的比例是整数倍,那么其工作原理与最近邻插值类似; 如果放大的比例不是整数倍,那么就会调用双线性插值进行放大。

    其中目标像素点与原图像素点的对应公式与上述方法的公式相同。

    3.2实际操作

    1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

    2.获取图像旋转中心,并获取图像的旋转矩阵

    3.用仿射变换函数实现图像旋转(像素区域插值法)

       4.显示效果并释放资源

      4、双三次插值法(精度更高,计算量更大)

      cv.INTER_CUBIC

      4.1基本原理:

      与双线性插值法相同,这个方法也是通过映射,再在映射点的邻域内通过加权放大图像中的像素值。但不同的是,这个方法需要原图像中找16个最接近原图像点(x,y)的已知像素点来加权,组成4*4的矩阵。

      目标像素点和原图像像素点的对应公式与上述方法的公式相同。

      4.2实际操作

      1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

      2.获取图像旋转中心,并获取图像的旋转矩阵

      3.用仿射变换函数实现图像旋转(双三次插值法)

        4.显示效果并释放资源

      5、Lanczos插值法(精度更高,计算量更大)

      cv.INTER_LANCZOS4

      5.1基本原理:

      与双三次插值法的思想相同,但不同但是这个方法需要原图像中找64个最接近原图像点(x,y)的已知像素点来加权,组成8*8的矩阵。并且换了个公式计算权重。

      目标像素点与原图像像素点的对应公式与上述方法的公式相同。

      5.2实际操作

      1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

      2.获取图像旋转中心,并获取图像的旋转矩阵

      3.用仿射变换函数实现图像旋转(Lancaos插值法)

        4.显示效果并释放资源

      总结多种插值方法:

      INTER_NEAREST:最近邻插值

      INTER_LINEAR:双线性插值(默认)

      INTER_CUBIC:双三次插值

      INTER_AREA:像素区域插值(适合缩小图像)

      INTER_LANCZOS4:Lanczos插值

      四、边缘填充

      我们知道,在图像旋转后,会出现默认用0的像素值补全的像素点,而得到这样的图片:

      这里介绍五个常用的边缘填充方法。

      1、边界复制(BORDER_REPLICATE)

      new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REPLICATE)

      边界复制会将边界处的像素值进行复制,然后作为边界填充的像素值,如下图所示,可以看到四周的像素值都一样。

      1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

      2.获取图像旋转中心,并获取图像的旋转矩阵(取scale为0.5,方便对比出边缘填充后的效果)

      3.边界复制

       4.显示效果并释放资源

      2、边界反射(BORDER_REFLECT)

      new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT)

       1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

      2.获取图像旋转中心,并获取图像的旋转矩阵(取scale为0.5,方便对比出边缘填充后的效果)

      3.边界反射

       4.显示效果并释放资源

      3、边界反射101(BORDER_REFLECT_101)

      new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT_101)

      与边界反射不同的是,边界反射101不在反射边缘的像素点。

       1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

      2.获取图像旋转中心,并获取图像的旋转矩阵(取scale为0.5,方便对比出边缘填充后的效果)

      3.边界反射101

        4.显示效果并释放资源

      (肉眼看不出边界反射和边界反射101的效果差别是正常的)

      4、边界常数(BORDER_CONSTANT)

      new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_CONSTANT,borderValue=(0,0,255))

      选择边界常数时,最后还要补充常数值为多少,默认填充的常数值为0,效果就如旋转后的图像。

      1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

      2.获取图像旋转中心,并获取图像的旋转矩阵(取scale为0.5,方便对比出边缘填充后的效果)

      3.边界常数(这里我选择红色填充)

        4.显示效果并释放资源

      5、边界包裹(BORDER_WRAP)

      new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_WRAP)

      1.读图并调整图像大小方便对比效果(此处与上述图像翻转相同,省略)

      2.获取图像旋转中心,并获取图像的旋转矩阵(取scale为0.5,方便对比出边缘填充后的效果)

      3.边界包裹

       4.显示效果并释放资源

      五、图像校正(透视变换)

      1、图像校正的原理时透视变换。

      1.透视变换是把一个图像投影到一个新的视平面的过程。透视投影是指把三维空间中的物体投影到二维平面上的过程,这个过程会导致物体在图像中出现形变和透视畸变。透视变换可以通过数学模型来矫正这种透视畸变,使图像中的物体看起来更符合我们的直观感受。

      2.在透视变换中我们也需要用到透视变换矩阵,OpenCV里提供了getPerspectiveTransform()函数用来生成该3*3的透视变换矩阵。

      在该函数中需要我们提供两个参数:src和dst。

      • src:原图像上需要进行透视变化的四个点的坐标,这四个点用于定义一个原图中的四边形区域。
      • dst:透视变换后,src的四个点在新目标图像的四个新坐标。

      (下面我会选择原图中四个角的点坐标:左上178,95 右上509,142 右下504,344 左下120,297)

      3.该函数会返回一个透视变换矩阵,得到透视变化矩阵之后,使用warpPerspective()函数即可进行透视变化计算,并得到新的图像。该函数需要我们提供如下参数:

      cv2.warpPerspective(src, M, dsize, flags, borderMode)

      • src:输入图像。
      • M:透视变换矩阵。这个矩阵可以通过getPerspectiveTransform函数计算得到。
      • dsize:输出图像的大小。它可以是一个Size对象,也可以是一个二元组。
      • flags:插值方法的标记。
      • borderMode:边界填充的模式。

      2、实际操作

      1.读图

      该原图为:

      2.获取图像高宽,并定义需要透视变换的点坐标

      3.获得透视变换矩阵

      4.进行透视变换

      5.显示效果并释放资源

      六、图像色彩空间转换

      OpenCV中,图像色彩空间转换是一个非常基础且重要的操作,就是将图像从一种颜色表示形式转换为另一种表示形式的过程。通过将图像从一个色彩空间转换到另一个色彩空间,可以更好地进行特定类型的图像处理和分析任务。常见的颜色空间包括RGB、HSV、YUV等。

      1、RGB颜色空间

      RGB颜色模型基于笛卡尔坐标系,如下图所示,RGB原色值位于3个角上,二次色青色、红色和黄色位于另外三个角上,黑色位于原点处,白色位于离原点最远的角上。因为黑色在RGB三通道中表现为(0,0,0),所以映射到这里就是原点;而白色是(255,255,255),所以映射到这里就是三个坐标为最大值的点。

      2、颜色加法

      原图分别是:

      2.1OpenCV的cv.add()函数方法(饱和操作)

      效果如下:

      2.2numpy直接相加(模运算)

      效果如下:

      3、加权加法

      cv.addWeighted(src1,alpha,src2,deta,gamma)

      (如果想要谁更亮,谁的权值占比要更大)

      效果如下:

      4、RGB转Gray(灰度)与RGB转HSV(HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色

      cv.cvtColor是OpenCV中的一个函数,用于图像颜色空间的转换。可以将一个图像从一个颜色空间转换为另一个颜色空间,比如从RGB到灰度图,或者从RGB到HSV的转换等。

      cv2.cvtColor(img,code)

      • img输入图像,可以是一个Numpy数组绘着一个OpenCV的Mat对象
      • code指定转换的类型,可以使用预定义的转换代码。

      原图为:

      效果如下:

      (RGB转Gray灰度)

      (RGB转HSV)


       

      七、灰度实验

      灰度图与彩色图最大的不同就是:彩色图是由R、G、B三个通道组成,而灰度图只有一个通道,也称为单通道图像,所以彩色图转成灰度图的过程本质上就是将R、G、B三通道合并成一个通道的过程。本实验中一共介绍了三种合并方法,分别是最大值法、平均值法以及加权均值法

      1、最大值法

      对于彩色图像的每个像素,它会从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。

      import cv2 as cv
      import numpy as np
      #读图
      cat=cv.imread('../images/cat1.png')
      cv.imshow('cat',cat)
      #获取图像的宽高
      h,w=cat.shape[:-1]
      #创建一个和原图大小一样的全零矩阵
      black=np.zeros((h,w),dtype=np.uint8)
      #遍历行(最大值法)
      for i in range(h):
          #print(h)#拿到的都是二维数组
          #遍历每一行,拿到像素点
          for j in range(w):
             # print(point)
              #拿到每一个像素点
             black[i,j]=max(cat[i,j,0],cat[i,j,1],cat[i,j,2])#cat[i,j]表示某一个像素点
      #显示灰度化结果
      cv.imshow('black',black)
      #释放资源
      cv.waitKey(0)
      cv.destroyAllWindows()

      2、平均值法

      对于彩色图像的每个像素,它会将R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。

      import cv2 as cv
      import numpy as np
      #读图
      cat=cv.imread('../images/cat1.png')
      cv.imshow('cat',cat)
      #获取图像的宽高
      h,w=cat.shape[:-1]
      #创建一个和原图大小一样的全零矩阵
      black=np.zeros((h,w),dtype=np.uint8)
      #遍历行(平均值法)
      for i in range(h):
          for j in range(w):
              #这里防止溢出,先把RGB值转换成int类型(转为更大的数据类型)
              #计算完之后再把类型转换回uint8
              black[i,j]=np.uint8((int(cat[i,j,0])+int(cat[i,j,1])+int(cat[i,j,2]))//3)#cat[i,j,n]表示取第i行j列的n通道的像素点
      #显示结果
      cv.imshow('black',black)
      cv.waitKey(0)
      cv.destroyAllWindows()

      3、加权均值法

      对于彩色图像的每个像素,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。本实验中,权重的比例为: R乘以0.299,G乘以0.587,B乘以0.114,这是经过大量实验得到的一个权重比例,也是一个比较常用的权重比例。

      import cv2 as cv
      import numpy as np
      #读图
      cat=cv.imread('../images/cat1.png')
      cv.imshow('cat',cat)
      #获取图像的宽高
      h,w=cat.shape[:-1]
      #创建一个和原图大小一样的全零矩阵
      black=np.zeros((h,w),dtype=np.uint8)
      #定义每个通道上的权重
      wb,wg,wr=0.114,0.587,0.299
      #遍历行(平均值法)
      for i in range(h):
          for j in range(w):
              # 用round取整,否则会得到小数
              # 当舍去部分 > 0.5 → 向上取整
              # 当舍去部分 < 0.5 → 向下取整
              # 当舍去部分 = 0.5 → 向最近的偶数取整
              black[i,j]=round(wb*cat[i,j,0]+wg*cat[i,j,1]+wr*cat[i,j,2])
      #显示结果
      cv.imshow('black',black)
      cv.waitKey(0)
      cv.destroyAllWindows()

      4、两个极端灰度值

      在灰度图像中,极端的灰度值是指亮度的两个极端:最暗和最亮

      • 最暗的灰度值:0(在灰度图像中呈现完全黑色)
      • 最亮的灰度值:255(在灰度图像中呈现完全白色)

      如下两图:

      小结

      易错易忘知识点:

      1.仿射变换

      平移变换:

      • 矩阵第三列控制平移量
      • 不改变图像形状和大小

      缩放变换:

      • 矩阵对角线元素控制各方向缩放比例
      • sx>1放大,sx<1缩小

      旋转变换:

      • center: 旋转中心点
      • angle: 旋转角度(逆时针为正方向)
      • scale: 缩放因子

       (剪切不常用)

      2.插值方法

      cv.warpAffine(img, M, (w,h), flags=cv.INTER_NEAREST)  # 最近邻,速度快,精度低

      cv.warpAffine(img, M, (w,h), flags=cv.INTER_LINEAR)  #双线性,最常用(默认),4个,2x2

      cv.warpAffine(img, M, (w,h), flags=cv.INTER_CUBIC)   # 双三次,精度高,16个,4x4

      cv.warpAffine(img, M, (w,h), flags=cv.INTER_AREA)    # 像素区域,放大(整数,非整数),缩小

      cv.warpAffine(img, M, (w,h), flags=cv.INTER_LANCZOS4) # Lanczos,精度高,64个,8x8

      3.颜色空间转换

      常用转换方法
      gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # RGB转灰度
      hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)    # RGB转HSV
      rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)    # BGR转RGB

      4.图像处理基本流程

      1. 读取图像: cv.imread()
      2. 预处理: 调整大小、格式转换
      3. 变换操作: 应用仿射变换矩阵
      4. 插值处理: 选择合适的插值方法
      5. 显示结果: cv.imshow()
      6. 资源释放: cv.waitKey(0)`和 cv.destroyAllWindows()

        今天学习的部分主要是图像几何变换和颜色处理的基础知识,包括仿射变换矩阵的构造和应用;不同灰度化方法的实现原理;插值算法的选择和使用场景;OpenCV基本函数的使用方法;图像数据类型的重要性,这些重要的基础知识为后续的图像处理和计算机视觉任务奠定了重要基础。

      Logo

      中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

      更多推荐