Image Process
Filtering
介绍 OpenCV 中的滤波函数。
滤波时一般会考虑到边缘问题,在此处介绍了所有补全边缘的方法。网页中右侧代表补全值得示例。边缘补全函数:
copyMakeBoarder
。
两种滤波方式:
- 调用相应的 Filtering 函数。
- 生成对应的卷积核,然后调用
Filter2D
函数。
bilateralFilter
双边滤波:边缘保留的滤波方法,将像素值差值大于某一阈值的边缘保留,不模糊。保留了图像的边缘信息。卷积核看成由空域核与色彩域核的叠加。其中的空域核代表空间距离,随到中心点的距离增加而减小。色彩域核代表通道值的差,随着相差增大而减小(保留边缘,即图像变化剧烈地方相差大,对应卷积核中值较小,影响小)。两者的乘积为滤波的核。
blur
、boxFilter
、GaussianBlur
、medianBlur
、sqrBoxFilter
省略。
sqrBoxFilter
将区域中的值先平方再求和,可以用来计算图片的统计参数。
Filter2D
卷积公式如下所示。anchor
表现了kernel
中心点和对应像素点之间的关系。
与之配套使用的就是一众
getKernel
之类的函数。
pyrMeanShiftFiltering
pyrMeanShiftFiltering
是在较为底层地处理图片,在这里详细阐述一下如何遍历并处理像素数据。
- 迭代终止条件判断 : 对
TermCriteria
处理 - 构建高斯金字塔 :
cv::pyrDown
。先是用create
函数声明各个层图片的大小,然后再降采样生成金字塔。 - 每一层金字塔遍历 : 顺着列遍历是
dptr += dstep - size.width*3
(dstep
是一行的字节数);顺着行遍历是dptr += 3
,(三通道也就是三个字节,访问不同通道则加上 0~2 的偏移)。
指针方便用偏移访问临近的元素,所以遍历时多用
.ptr()
方法。
- 临近空域访问 : 这里用了循环展开优化。
- 下层金字塔与上层映射:根据降采样的比例,计算对应位置,然后用指针处理访问。
图像金字塔
PyrUp & PyrDown
PyrDown
:降采样图像,将原图像先做高斯卷积,再剔除偶数行和列。(所谓的高斯金字塔过程)
PyrUp
: 上采样图像;将原先图像在偶数行列插入0后,再做高斯卷积。
对于
Laplace
金字塔,每一层保留的差值(恢复时使用),就是将该层(图像0)先PyrDown
再PyrUp
得到图像1,图像0 减去 图像1 就是这一层。
buildPyramid
buildPyramid
: 一步到位建立高斯金字塔。
形态学操作
腐蚀:拿一个结构元素去滑动窗口,将窗口覆盖下图像的最小值当作结构元素中心点的像素值;
膨胀:拿一个结构元素去滑动窗口,将窗口覆盖下图像的最大值当作结构元素中心点的像素值;
对小区域的操作。
开操作:先腐蚀后膨胀,可以去掉前景中小的对象(在腐蚀中消失,膨胀中无法复原)。
闭操作:先膨胀后腐蚀,可以填充前景中小的洞(洞在膨胀中补齐,腐蚀不会使其重现)。
形态学梯度: 用于刻画目标边界或边缘位于图像灰度级剧烈变化的区域,形态学梯度根据膨胀或者腐蚀与原图作差组合来实现增强结构元素领域中像素的强度,突出高亮区域的外围。
梯度分为四种:
-
基本梯度
:基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像也是OpenCV中支持的计算形态学梯度的方法,而此方法得到梯度有被称为基本梯度。 -
内部梯度
:是用原图像减去腐蚀之后的图像得到差值图像,称为图像的内部梯度。 -
外部梯度
:是用图像膨胀之后再减去原来的图像得到的差值图像,称为图像的外部梯度。 -
方向梯度
:方向梯度是使用X方向与Y方向的直线作为结构元素之后得到图像梯度,用X方向直线做结构元素分别膨胀与腐蚀之后得到图像求差值之后称为X方向梯度,用Y方向直线做结构元素分别膨胀与腐蚀之后得到图像求差值之后称为Y方向梯度。
erode & dilate
注意 kernal
这个参数。一般情况可以用 getStructureElement
函数获取,如果传入 cv::Mat()
,则是一个 3*3 的正方形窗。实际上核就是一个 mask
。在一个窗内,纳入形态学操作的像素点对应位置为 1 。
morphologyEx
形态学操作主函数。 op
参数决定实际操作(开,闭,膨胀,腐蚀等)。