OpenCV的滤波与卷积

本文深入探讨OpenCV中的图像处理技术,包括滤波、卷积、阈值化操作和图像形态学。介绍了预处理知识,如滤波器、核和卷积的基本概念,以及边界外推和处理。详细讲解了阈值化,如Otsu算法和自适应阈值。接着阐述了平滑技术,如模糊滤波、中值滤波和高斯滤波,以及导数和梯度计算。最后,讨论了图像形态学的各种操作,如膨胀、腐蚀、开闭操作等,以及如何自定义核进行卷积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

预备知识

滤波、核和卷积

边界外推和边界处理

阈值化操作

Otsu算法

自适应阈值

平滑

简单模糊和方框型滤波器

中值滤波器

高斯滤波器

双边滤波器

导数和梯度

索贝尔导数

Scharr滤波器

拉普拉斯变换

图像形态学

膨胀和腐蚀

通用形态学函数

开操作和闭操作

形态学梯度

顶帽和黑帽

自定义核

用任意线性滤波器做卷积

用cv::filter2D()进行卷积

通过cv::sepFilter2D使用可分核

生成卷积核


预备知识

滤波、核和卷积

滤波器指的是一种由一幅图像 I(x,y)根据像素点x,y附近的区域计算得到一幅新图像 I'(x,y)的算法。其中,模板规定了滤波器的形状以及这个区域内像素的值的组成规律,也称“滤波器”或“核”。在下面的介绍中多采用的是线性核,即 I'(x,y)的像素的值由 I(x,y)及其周围的像素的值的加权相加得来的。可由以下方程表示:

I'(x, y)=\sum _{i, \: j\in kernal}k_{i,\: j}\cdot I(x+i,\: y+j)

\begin{bmatrix} 1 & 1 & 1& 1 & 1\\ 1 & 1& 1& 1 & 1\\ 1& 1 & \mathbf{1} & 1& 1\\ 1 & 1& 1 & 1 & 1\\ 1 & 1 & 1 & 1& 1 \end{bmatrix} \frac{1}{25}\begin{bmatrix} 1 & 1 & 1& 1 & 1\\ 1 & 1& 1& 1 & 1\\ 1& 1 & \mathbf{1} & 1& 1\\ 1 & 1& 1 & 1 & 1\\ 1 & 1 & 1 & 1& 1 \end{bmatrix} \begin{bmatrix} -1 & 0 &1 \\ -2 &\mathbf{0} & 2\\ -1& 0& 1 \end{bmatrix} \frac{1}{273}\begin{bmatrix} 1 & 4 & 7& 4 & 1\\ 4 & 16& 26& 16 & 4\\ 7& 26 & \mathbf{41} & 26& 7\\ 4 & 16& 26 & 16 & 4\\ 1 & 4 & 7 & 4& 1 \end{bmatrix}
(A)5×5盒状核 (B)规范化的5×5盒状核 (C)3×3的Sobel核 (D)5×5规范化高斯核

注:“锚点”均用粗体表示

边界外推和边界处理

自定义边框

在处理图像时,只要告诉调用的函数添加虚拟像素的规则,库函数就会自动创建虚拟像素。cv::copyMakeBorder()就是一个为图像创建边框的函数。

cv::copyMakeBorder(InputArray src, InputArray dst, int top, int bottom, int left, int right, int borderType, const cv::Scalar& value=cv::Scalar())

作用:通过指定两幅图像,同时指明填充方法,该函数就会将第一幅图填补后的结果保存在第二幅图像中。其中,src是原图像,dst是填充后的图像,top、bottom、left、right分别是四个方向上的尺寸,borderType是像素填充的方式,value是常量填充时的值。

borderType的取值及效果
取值 效果
cv::BORDER_CONSTANT 为每个边框像素赋予一个相同的值。
cv::BORDER_WRAP 类似于平铺扩充
cv::BORDER_REPLICATE 复制边缘的像素扩充
cv::BORDER_REFLECT 通过镜像复制扩充
cv::BORDER_REFLECT_101 通过镜像复制扩充,边界像素除外
cv::BORDER_DEFAULT cv::BORDER_REFLECT_101

自定义外推

 int cv::borderInterpolate(int p, int len, int borderType)

作用:计算一个维度上的外推,p为原图上一个坐标,len是p指维度上的大小,borderType是边界类型。

例子:混合的边界条件下计算一个特定像素的值,在一维中使用BORDER_REFLECT_101,在二维中使用BORDER_WRAP:

float val = img.at<float>(
    cv::borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101),
    cv::borderInterpolate(-5, img.cols, cv::BORDER_WRAP)
)

阈值化操作

阈值化操作的原理是对于数组中每个值,根据其高于或低于某个阈值做出相对应的处理,OpenCV中提供了实现这种功能的方法cv::threshold()。

double cv::threshold(InputArray src, cv::OutputArray dst, double thresh, double maxValue, int thresholdType)

thresholdType的可选项及其操作
阈值类型 操作
cv::THRESH_BINARY DST_i=(SRC_i > thresh)\: ?\: MAXVALUE:0
cv::THRESH_BINARY_INV DST_i=(SRC_i > thresh)\: ?\: 0:MAXVALUE
cv::THRESH_TRUNC DST_i=(SRC_i > thresh)\: ?\: THRESH:SRC_i
cv::THRESH_TOZERO DST_i=(SRC_i > thresh)\: ?\: SRC_i:0
cv::THRESH_TOZERO_INV DST_i=(SRC_i > thresh)\: ?\: 0:SRC_i
不同阈值类型对应的结果
</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值