CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
定义
分割可以看作将全图$R$划分为子区域$R_1,R_2,\dots,R_n$的过程(其中,$P(R)$为定义在集合$R$的点上的逻辑谓词):
- $\bigcup_{i=1}^nR_i=R$
- $R_i$是连通块
- $\forall i \ne j,R_i\cap R_j=\emptyset$
- $\forall i \ne j,P(R_i\cup R_j)$为假
- $P(R_i)$为真
图像分割一般基于亮度值的两种基本特性(不连续性和相似性)。
间断检测
寻找间断最一般方法是对整幅图像使用模板(滤波器)进行检测。
点检测
1 | 1 | 1 |
---|---|---|
1 | -8 | 1 |
1 | 1 | 1 |
如果作用算子后的图像$\vert R(x,y)\vert >T$,其中阈值$T>0$,则模板中心位置的点为所求的点。
线检测
线检测通常采用如下 4 种摸板:
-
水平:
-1 -1 -1 2 2 2 -1 -1 -1 -
$+45\degree$:
2 -1 -1 -1 2 -1 -1 -1 2 -
垂直:
-1 2 -1 -1 2 -1 -1 2 -1 -
$-45\degree$:
-1 -1 2 -1 2 -1 2 -1 -1
如果上述 4 种模板产生的响应分别为:$R_1,R_2,R_3,R_4$,并且$\exist i\forall j\ne i \vert R_i\vert > \vert R_j \vert$,则认为此点与模板$i$方向的线有关。
边缘检测
傅里叶变换无法刻画边缘,只知道高频成分,不知道高频在哪里。一种方法是局部傅里叶变换,衍生出小波变换(就是要构造一种高通滤波器):有震荡信号的位置(小范围震荡且积分为 0),可以刻画边缘。
主要使用一阶导数和二阶导数检测图像中的边缘。如下图所示,二阶导数会增大噪声,因此做边缘检测之前应该先抑制噪声(平滑)。
通常通过阈值确定边缘位置。
- 常用方法:
- Canny 边缘检测器:低错误率(边缘一个不落,一个不多);边缘点应该被很好定位(标记的边缘点与真实边缘中心之间的距离最小);单一边缘点响应(对于真实的边缘点,检测器仅返回一个点,即真实边缘周围的局部最大数应该最小)
- 算法步骤:用一个高斯滤波器平滑输入图像;计算梯度幅值图像和角度图像(Canny 为二阶梯度算子)$M(x,y)=\sqrt{g_x^2+g_y^2},\quad\alpha(x,y)=\arctan \frac{g_y}{g_x}$;梯度幅值图像应用非最大抑制;用双阈值处理和连接分析来检测并连接边缘
- 双阈值法:高阈值$T_H$和低阈值$T_L$,比率为$2:1$或$3:1$ \(\begin{aligned} g_{NN}(x,y) &= g_N(x,y)\geq T_H & \text{强边缘}\\ g_{NL}(x,y) &= g_N(x,y)\geq T_L & \text{弱边缘(可能是边缘也可能不是)+强边缘}\\ g_{NL}(x,y) &= g_{NL}(x,y)-g_{NH}(x,y) & \text{弱边缘} \end{aligned}\)
- 用弱边缘补齐强边缘来获得完整边缘
- 在$g_{NN}(x,y)$中定位下一个未被访问的边缘像素$p$
- 在$g_{NL}(x,y)$中用 8 连通方法连接到$p$
- 如果$g_{NN}(x,y)$中所有非零标记都已经访问过,则跳到(d),否则(a)
- 将$g_{NL}(x,y)$中未被标记为有效边缘的像素的所有像素置零。
- 将$g_{NL}(x,y)$中非零像素附加到$g_{NN}(x,y)$
- 边缘连接:边界是封闭的边缘。$\text{边界检测}=\text{边缘检测}+\text{边缘连接}$
- 区域处理:用多边形拟合算法
- 边界检测
- 用 Hough(霍夫)变换进行边界检测:通过边界点找已知形状的目标。
- 直线检测问题:已知一组边缘点,找一条直线,使它通过最多边缘点。直线方程用极坐标表示$\rho=x\cos\theta+y\sin\theta$通过辅助角变换可得$\rho=A_0\sin(\theta+\phi_0)$故可映射到$\rho O\theta$空间,其中每一个点是$xOy$平面上的通过同一个点的一条线。如果有一组位于由参数$\rho_0$和$\theta_0$决定的直线上的边缘点,则每个边缘点对应了$\rho,\theta$空间的一条正弦曲线。所有这些曲线必然会交于点$(\rho_0,\theta_0)$,因为这是它们共享的一条直线的参数。故对于边缘点的直线拟合问题,即找一个使边缘点确定的正弦曲线相交最多的点$(\rho,\theta)$。