A.模糊(滤波)
1.归一化盒子滤波(BoxFilter)
主要功能:在给定的滑动窗口下,对每个窗口内的像素值进行快速相加求和
缺点:无法克服边缘像素信息丢失缺陷,原因是均值滤波是基于平均权重
原理:
- 给定图像,宽高为(M,N),确定待求矩形模板的宽高(m,n),如图紫色矩形。图中黑色方块代表像素点,红色方块代表假象像素。
- 开辟一段大小为M的数组,记为buff,用来储存计算过程中的,存在红色假象像素点中
- 将矩形模板(紫色)从左上角,从左往右,从上往下单元素移动,每移动到新位置,计算矩形内的像素和保存在数组A(输出图片)中。以(0,0)位置为例:
- 将绿色矩形内的每一列像素求和,结果放在buff内(红色方块)
- 对蓝色矩形内的像素点求和,结果即为紫色特征矩形内的像素和,把它存放到数组A
- 每次紫色矩形向右移动时,实际上就是求对应的蓝色矩形的像素和,此时只需把上次的求和结果减去蓝色矩形内的第一个红色快,再加上其右边的红色块,就是当提前位置的和,公式表达为:sum[i] = sum[i-1] - buf[x-1] + buff[x+m-1]
- 当紫色矩形移动到行末时,需对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:像素值差异的地方
- 非最大信号抑制
- 将当前像素的梯度强度与沿正负方向梯度方向上的两个像素比较
- 若当前像素的梯度强度与另外两个像素相比最大,则该像素点保留位边缘点,否则该像素点会被抑制
- 高低阈值输出二值图像:抑制噪声引起的弱边缘
- 高斯模糊GaussianBlur
J.霍夫变换
霍夫直线变换
- 简介
- 用来做直线检测
- 前提条件:边缘检测已完成
- 平面空间到极坐标空间转换
- 原理
- 图形原理在notability中,后续整理
- r = x cos(theta) + y sin(theta)
- canny边缘检测
- 逐像素点进行霍夫空间变换:由像素坐标系(x,y)变换到笛卡尔坐标系(r, theta)
- 局部非极大值抑制:去除噪声点
- 对笛卡尔坐标系中的点排序
- 求得笛卡尔坐标系中点极大值对应的角度和距离
- 将笛卡尔坐标转为像素坐标,画线
- 简介
霍夫圆变换(21HT)
$r^2 = (x-a)^2 + (y-b)^2$
第一阶段:检测圆心
- (中值滤波:去除噪声)
- canny边缘检测
- sobel计算图形梯度,并确定圆周线,其中圆周的梯度就是其法线
- 在二维霍夫空间内,绘出所有图形的梯度直线,某坐标点上累加和的值越大,说明在该点上直线相交的次数越多,也就是越有可能是圆心
- 在霍夫空间的4邻域内进行非最大值抑制
- 设定一个阈值,霍夫空间内累加和大于该阈值的点就对应于圆心
第二阶段:检测半径
- 计算某一个圆心到所有圆周线的距离,这些距离中就有该圆心所对应的圆的半径的值,这些半径值当然是相等的,并且这些圆半径的数量要远远大于其他距离值相等的数量
- 设定两个阈值,定义为最大半径和最小半径,保留距离在这两个半径之间的值,这意味着我们检测的圆不能太大,也不能太小
- 对保留下来的距离进行排序
- 找到距离相同的那些值,并计算相同值的数量
- 设定一个阈值,只有相同值的数量大于该阈值,才认为该值是该圆心对应的圆半径
- 对每一个圆心,完成上面的2.1~2.5步骤,得到所有的圆半径
K.像素重映射
- 定义:g(x, y) = f(h(x, y))
- 把输入图像中各个像素按照一定规则映射到另一张图像对应位置
- cv::remap()
L.直方图均衡化
- 图像直方图
- 定义:统计整个图像在灰度范围内的像素值(0-255)出现的频率次数
- 反映:图像灰度的分布情况
- 流程
- 计算原图像素值概率
- 从小到大累加像素值概率
- 用 累加概率 * 像素最大值 之积 替换原图像像素值
- cv::equalizeHist(src, dst)
- 输入为灰度图
- 应用:提高图像对比度、拉伸图像灰度值范围,同时图像的细节更为丰富