图像处理算法

A.模糊(滤波)

1.归一化盒子滤波(BoxFilter)

  • 主要功能:在给定的滑动窗口下,对每个窗口内的像素值进行快速相加求和

  • 缺点:无法克服边缘像素信息丢失缺陷,原因是均值滤波是基于平均权重

  • 原理:

    1. 给定图像,宽高为(M,N),确定待求矩形模板的宽高(m,n),如图紫色矩形。图中黑色方块代表像素点,红色方块代表假象像素。
    2. 开辟一段大小为M的数组,记为buff,用来储存计算过程中的,存在红色假象像素点中
    3. 将矩形模板(紫色)从左上角,从左往右,从上往下单元素移动,每移动到新位置,计算矩形内的像素和保存在数组A(输出图片)中。以(0,0)位置为例:
      • 将绿色矩形内的每一列像素求和,结果放在buff内(红色方块)
      • 对蓝色矩形内的像素点求和,结果即为紫色特征矩形内的像素和,把它存放到数组A
    4. 每次紫色矩形向右移动时,实际上就是求对应的蓝色矩形的像素和,此时只需把上次的求和结果减去蓝色矩形内的第一个红色快,再加上其右边的红色块,就是当提前位置的和,公式表达为:sum[i] = sum[i-1] - buf[x-1] + buff[x+m-1]
    5. 当紫色矩形移动到行末时,需对buff进行更新。因整个绿色矩形下移一个像素,所以对于每个buff[i]需要加一个新进来的像素,再减去一个出去的像素,开始新一行的计算
  • 此处为原理流程,源码见代码部分

2.高斯滤波

  • 功能:
  • 缺点:部分克服边缘像素信息丢失缺陷,但无法完全避免,因为没有考虑像素值的不同
  • 原理:

3.中值滤波

  • 功能:
  • 缺点:部分克服边缘像素信息丢失缺陷,但无法完全避免,因为没有考虑像素值的不同
  • 原理:

4.双边滤波

  • 功能:
  • 优缺点:避免边缘信息丢失,保留图像轮廓不变
  • 原理:

B.形态学操作

1.定义

形态学定义 函数定义 原理 应用
膨胀 dilate 取领域内最大值作为中心点新像素值 前景为黑,变小;前景为白,变大
腐蚀 erode 取领域内最小值作为中心点新像素值 前景为黑,变大;前景为白,变小
开操作 open 先腐蚀后膨胀(注意:结构元素需设置为包含部分目标对象) 假设对象是前景色,背景是黑色,可以去掉小的对象
闭操作 close 先膨胀后腐蚀 假设对象是前景色,背景是黑色,可以填补小的洞
形态学梯度 Morphological Gradient 膨胀减腐蚀,dst = morph(src, element) = dilate(src, element) - erode(src, element) 又称为基本梯度(其他还包括内部梯度、方向梯度)
顶帽 top hat 源图像与开操作之间的差值图像
黑帽 black hat 闭操作与源图像的差值图像

2.提取水平与垂直线

  • 提取步骤
    • 输入彩色图像-imread
    • 转换为灰度图像-cvtColor
    • 转换为二值图像-adaptiveThreshold
    • 定义结构元素
    • 开操作(腐蚀+膨胀)提取水平与垂直线
  • 启示:
    • 卷积核可根据需要更改形状,从原图提取想要的形状
    • 提取文字、图像(去除干扰点),可用不同卷积核

C.图像上采样和降采样

  • 图像金字塔
    • 高斯金字塔:用来对图像进行降采样
      • 从底向上,逐层降采样得到
      • 降采样之后,图像大小是原图MN的M/2 N/2(1/4),即对原图像删除偶数行与列,得到降采样后上一层的图片
      • 两步生成过程:
        • 对当前层进行高斯模糊
        • 删除当前层的偶数行与列
    • 高斯不同:
      • 定义:把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像成为高斯不同(DOG)
      • 高斯不同是图像的内在特征,在灰度图像增强‘角点检测中常用到
    • 拉普拉斯金字塔:用来重建一张图片,根据它的上层降采样图片

D.基本阈值操作

  • 图像阈值
    • 定义:图像分割的标尺
    • 阈值产生的算法
      • THRESH_OTSU
      • THRESH_TRIANGLE
    • 阈值类型
      • 阈值二值化(threshold binary):大于取阈值,小于取零
      • 阈值反二值化(threshold binary inverted):大于取零,小于取阈值
      • 截断(truncate):大于处取阈值,小于不变
      • 阈值取零(threshold to zero):大于不变,小于取零
      • 阈值反取零(threshold to zero inverted):大于取零,小于不变

E.自定义线性滤波

  • 卷积概念
    • 卷积是图像处理中一个操作,是kernrl在图像的每个像素上的操作
    • kerner本质上是一个固定大小的矩阵数组,其中中心点为锚点(anchor point)
    • 求锚点周围覆盖的像素乘积之和(包括锚点),除以卷积数组大小,用来替代锚点下像素点值
  • 常见算子
    • Robert算子:2*2,{1, 0, 0, -1}或{0, 1, -1, 0},寻找梯度、边缘
    • Sobel算子:3*3,{-1, 0, 1, -2, 0, 2, -1, 0, 1}或{-1, -2, -1, 0, 0, 0, 1, 2, 1},常用于边缘检测
    • 拉普拉斯算子:3*3,{0, -1, 0, -1, 4, -1, 0, -1, 0},寻找梯度、边缘
  • 自定义卷积模糊

F.边缘处理

  • 卷积边缘问题:
    • 图像卷积的时候边界像素不能被卷积操作
    • 原因在于边界像素没有完全跟kernel重叠
  • 边缘处理
    • 在卷积开始之前增加边缘像素,填充像素值为0或RGB黑色
    • opencv中默认方法为:BORDER_DEFAULT
      • BORDER_CONSTANT - 用指定像素值填充边缘
      • BORDER_REPLICATE - 用已知的边缘像素值填充边缘像素
      • BORDER_WRAP - 用另外一边的像素来补偿填充

G.sobel算子

  • 卷积应用-图像边缘提取
    • 图像像素值渐变或突变,求导取最高点即为跃迁点(变化最大)
  • Sobel算子
    • Sobel算子:3*3,{-1, 0, 1, -2, 0, 2, -1, 0, 1}或{-1, -2, -1, 0, 0, 0, 1, 2, 1},常用于边缘检测
    • 是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度
    • Sobel算子功能集合高斯平滑和微分求导
    • 又称为一阶微分算子,求导算子,在水平和垂直两方向求导,再平方和开根号(绝对值之和),得到(图像x与y方向)梯度图像
  • Schar函数
    • 求取导数的近似值,kernel=3时不准确,opencv使用改进版本Scharr函数,3*3,{-3, 0, 3, -10, 0, 10, -3, 3}或{-3, -10, 3, 0, 0, 0, 3, 10, 3}
  • 代码流程
    • 高斯平滑:使图像像素平滑变化
    • 转灰度
    • 求梯度x和y
    • 混合xy
  • 个人理解:
    • 用卷积和扩大水平/垂直像素差异

H.laplance算子

  • 原理
    • 比sobel算子更进一步,这里采用 二阶导为零处即为像素值变化最大处
  • 流程
    • 高斯模糊-去噪声GaussianBlur()
    • 转灰度cvtColor()
    • 拉普拉斯-二阶导计算Laplance()
    • 取绝对值convertScaleAbs()

I.Canny边缘检测

  • 流程:
    • 高斯模糊GaussianBlur
      • 将高斯算子与原图像卷积
    • 灰度转换cvtColor
    • 计算梯度Sobel/Scharr:像素值差异的地方
    • 非最大信号抑制
      1. 将当前像素的梯度强度与沿正负方向梯度方向上的两个像素比较
      2. 若当前像素的梯度强度与另外两个像素相比最大,则该像素点保留位边缘点,否则该像素点会被抑制
    • 高低阈值输出二值图像:抑制噪声引起的弱边缘

J.霍夫变换

  • 霍夫直线变换

    • 简介
      • 用来做直线检测
      • 前提条件:边缘检测已完成
      • 平面空间到极坐标空间转换
    • 原理
      • 图形原理在notability中,后续整理
      • r = x cos(theta) + y sin(theta)
        1. canny边缘检测
        2. 逐像素点进行霍夫空间变换:由像素坐标系(x,y)变换到笛卡尔坐标系(r, theta)
        3. 局部非极大值抑制:去除噪声点
        4. 对笛卡尔坐标系中的点排序
        5. 求得笛卡尔坐标系中点极大值对应的角度和距离
        6. 将笛卡尔坐标转为像素坐标,画线
  • 霍夫圆变换(21HT)

    • $r^2 = (x-a)^2 + (y-b)^2$

    • 第一阶段:检测圆心

      • (中值滤波:去除噪声)
      1. canny边缘检测
      2. sobel计算图形梯度,并确定圆周线,其中圆周的梯度就是其法线
      3. 在二维霍夫空间内,绘出所有图形的梯度直线,某坐标点上累加和的值越大,说明在该点上直线相交的次数越多,也就是越有可能是圆心
      4. 在霍夫空间的4邻域内进行非最大值抑制
      5. 设定一个阈值,霍夫空间内累加和大于该阈值的点就对应于圆心
    • 第二阶段:检测半径

      1. 计算某一个圆心到所有圆周线的距离,这些距离中就有该圆心所对应的圆的半径的值,这些半径值当然是相等的,并且这些圆半径的数量要远远大于其他距离值相等的数量
      2. 设定两个阈值,定义为最大半径和最小半径,保留距离在这两个半径之间的值,这意味着我们检测的圆不能太大,也不能太小
      3. 对保留下来的距离进行排序
      4. 找到距离相同的那些值,并计算相同值的数量
      5. 设定一个阈值,只有相同值的数量大于该阈值,才认为该值是该圆心对应的圆半径
      6. 对每一个圆心,完成上面的2.1~2.5步骤,得到所有的圆半径

K.像素重映射

  • 定义:g(x, y) = f(h(x, y))
    • 把输入图像中各个像素按照一定规则映射到另一张图像对应位置
  • cv::remap()

L.直方图均衡化

  • 图像直方图
    • 定义:统计整个图像在灰度范围内的像素值(0-255)出现的频率次数
    • 反映:图像灰度的分布情况
  • 流程
    1. 计算原图像素值概率
    2. 从小到大累加像素值概率
    3. 用 累加概率 * 像素最大值 之积 替换原图像像素值
  • cv::equalizeHist(src, dst)
    • 输入为灰度图
  • 应用:提高图像对比度、拉伸图像灰度值范围,同时图像的细节更为丰富
-------------本文结束感谢您的阅读-------------
显示 Gitment 评论