数字图像处理(二):图像基本操作

目录

    • 介绍二值图、灰度图、RGB彩色图
    • 图像通道分离与合并
    • 灰度图和二值图转换
    • 两图像的加减乘除
    • 图片的线性变换和非线性变换:对像素值进行运算
    • 图片融合

介绍二值图、灰度图、RGB彩色图

  • 二值图只有2种取值
  • 灰度图有8位,即0-255种取值。0代表黑色,255代表白色
    • 二维矩阵
  • RGB中R、G、B通道各有8位,即各有0-255种取值
    • 三维矩阵

图像通道分离与合并

  • 通道分离b, g, r = cv2.split(img)
    • 生成的通道顺序为b,g,r三通道
    • 注意返回值数量和顺序
  • 通道合并img2 = cv2.merge([b, g, r])
    • 输入的通道顺序为b,g,r
    • 注意输入通道顺序,后续工程中容易出错

灰度图和二值图转换

  • 彩色图转灰度图

    • 函数 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    • 单通道加权融合
      • gray = 1/3*b + 1/3*g + 1/3*r 此时生成的数据为浮点型,需要将其转换为uint8进行图片显示
      • np.uint8(gray) 可以
      • gray.astype(np.uint8) 可以
  • 图像二值化

    • 自定义阈值进行二值化处理

      //将灰度图中大于阈值的赋值255,小于阈值的赋值0,形成二值图像
      
      thresh = 125
      gray[gray > thresh] = 255
      gray[gray <= thresh] = 0
      
    • 函数_, img_bin = cv2.threshold(img_gray, th1, th2, cv2.THRESH_BINARY)

      • 参数解释:将img_gray中大于阈值th1的数字,修改为阈值th2
        • cv2.threshold(img_gray, 125, 255, cv2.THRESH_BINARY) —> 代表将img_gray中大于125的像素值赋值为255
      • 注意该函数中的返回值为两个,第二个是灰度图

两图像的加减乘除

  • 相加:混合图像、添加噪声

  • 相减:消除背景、差影法(比较差异、运动跟踪)

  • 相乘:掩膜(mask)

  • 相除:校正设备、比较差异

    • 如果两幅图相同,那么相除之后存在差异的地方结果不等于1,从而得到差异位置
  • 进行加减乘除实验

    • 所用图片:obj、bg、mask、noise(从左往右)

      数字图像处理(二):图像基本操作_第1张图片

    • 相加:

      • 直接相加:img1*0.5+img2*0.5

      • 函数1:cv2.add(img1*0.5, img2*0.5)

        • 小技巧:两幅图片赋值权重相加应等于1,此时可令相加后的图片最大值仍为255。也就是 255 ∗ 0.5 + 255 ∗ 0.5 = 255 255*0.5+255*0.5=255 2550.5+2550.5=255.

      数字图像处理(二):图像基本操作_第2张图片

      • 函数2:cv2.addWeight(img1, alpha, img2, beta, gamma)

        • 此时相加图片的某点 P i P_i Pi像素值如下所示,其中 P 1 i 、 P 2 i P1_i、P2_i P1iP2i代表图片1和图片2在点i处的像素值
          P i = P 1 i ∗ α + P 2 i ∗ β + γ P_i=P1_i*\alpha+P2_i*\beta+\gamma Pi=P1iα+P2iβ+γ

        • 结果与上相同,不做展示

      • 两个函数的区别:

        • cv2.add生成的图片子类型为float64
        • cv2.addWeight生成的图片子类型为uint8
    • 相减

      • 直接相减:img1-img2
      • 函数:cv2.subtract(img1, img2)
    • 相乘

      • 直接相乘:img1*img2
      • 函数:cv2.multiply(img1, img2)
    • 相除(基本不用,乘以一个数的倒数也可以)

      • 直接相除:img1/(img2+1)
        • 为了避免在相除过程中出现图像像素为0的情况,所以一般都采用+1的方法
      • 函数:cv2.divide(img1, img2)
        相除:img1/(img2+1)
        • 为了避免在相除过程中出现图像像素为0的情况,所以一般都采用+1的方法
      • 函数:cv2.divide(img1, img2)
        • 不加1也可以

图片的线性变换和非线性变换:对像素值进行运算

  • 线性变换

    • 直接变换:

      b = 20
      k = 2
      
      //第一种应对像素值超出范围的方法
      img = b + k * img1.astype(np.int32)  //当进行线性变换时像素值可能会超出255,所以像素值的类型定义为np.int32,以此承载更大的值
      show(img)    //显示图片正常
      
      //第二种
      img = b + k * img1
      np.clip(img, 0, 255)  //利用该函数将大于255的,等于255;小于0的,等于0
      show(img)   //显示图片正常
      
    • 函数:cv2.convertScaleAbs(img, alpha=2, beta=20)

      • 效果: i m g ∗ α + β img*\alpha+\beta imgα+β
      • 使用函数不必担心像素超出范围
  • 非线性变换

    • 直接变换:与上相同
    • 挑选平方的非线性变换:np.power(img, 0.5) 代表将所有的像素值均开方

图片融合

  • 要用到的图片:花、刺猬、掩膜;目标:将刺猬放到花的中间

    数字图像处理(二):图像基本操作_第3张图片

  • 思路将花的中间扣掉,将刺猬的中间保存,之后相加

    flower = flower * (1 - Mask)  //掩膜翻转,保留边缘
    hedgehog = hedgehog * Mask    //保留中心
    nice = flower * 0.8 + hedgehog   //融合边缘过渡平滑,所以将背景花*0.8
    

数字图像处理(二):图像基本操作_第4张图片

数字图像处理(二):图像基本操作_第5张图片

你可能感兴趣的:(笔记,计算机视觉,python,opencv)