|
大小: 198
备注:
|
大小: 3237
备注:
|
| 删除的内容标记成这样。 | 加入的内容标记成这样。 |
| 行号 1: | 行号 1: |
| 1. 如何检测图像中的直线? 1. 如何检测图像中的边缘? 1. 如何进行阈值分割?如何选取阈值? 1. 什么是区域生长?如何进行区域分裂与合并? |
== 点、线、边缘的检测 == 点、线、边缘的检测常用空域滤波的方法进行。{{{#!latex $$R = w_1z_1+w_2z_2+\dots +w_9z_9=\sum_{i=1}^{9}w_iz_i$$ }}} === 检测孤立点 === 检测孤立点采用的滤波模板是 {{{ -1 -1 -1 -1 8 -1 -1 -1 -1 }}} 检测的标准是判断滤波后的绝对值是否大于某一阈值 {{{#!latex $$|R| \ge T$$ }}} 在matlab中可以用如下方法实现: {{{ g = abs(imfilter(f, w)) >= T; }}} 另一种检测方法是看一个邻域内的最大值和最小值的差是否超过某个阈值。实现方法是:{{{ g = imsubtract(ordfilt2(f, m*n, ones(m,n)), ordfilt2(f, 1, ones(m,n))) >= T; }}} {{attachment:figure1002.png}} === 线检测 === 线检测的模板可以是: {{attachment:figure1001.png}} 如果对某一方向的线感兴趣,可以使用相应的模板做滤波后进行阈值处理。 {{attachment:figure1003.png}} === 边缘检测 === 边缘所满足的条件: * 像素值的一阶导数的绝对值大于指定阈值 * 像素值的二阶导数有零交叉。 {{attachment:figure1004.png}} Sobel:{{{#!latex $$g = \sqrt{ [(z_7+2z_8+z_9) - (z_1 + 2z_2 + z_3)]^2 + [(z_3+2z_6+z_9)-(z_1+2z_4+z_7))]^2 }$$ }}} {{{ g = edge(f, 'sobel', T, dir) }}} f是输入图像,T是一个阈值,dir是方向('horizontol'或者'vertical'或者'both') Prewitt:{{{ g = edge(f, 'prewitt', T, dir) }}} Roberts:{{{ g = edge(f, 'roberts', T, dir) }}} Laplacian of Gaussian: {{{ g = edge(f, 'log', T, sigma) }}}sigma为标准差,默认是2。 检测零交叉: {{{ g = edge(f, 'zerocross', T, H) }}}H指定卷积的模板。 Canny: {{{ g = edge(f, 'canny', T, sigma) }}} {{attachment:figure1005.png}} {{attachment:figure1006.png}} == Hough变换 == 给定(xi,yi)点,经过该点的直线参数a和b满足:yi=axi+b,a为斜率,b为截距。将经过该点的所有可能的a和b画在ab构成的参数坐标系内,可以得到一条直线。 {{attachment:figure1007.png}} 原图像上的直线y = ax+b上所有点在参数空间内对应的直线会交在同一点,这点的坐标就是所求的参数值。 由于a可能为无穷大,所以在计算上不方便。我们将直线方程写成参数形式: {{{#!latex $$x\cos\theta + y\sin\theta = \rho $$ }}} 原始图像上的一个点,对应于参数空间上的一条曲线: {{attachment:figure1008.png}} 例子: {{attachment:figure1009.png}} 峰值检测: 1. 找到最大值,记下它的位置 1. 将上一位置周围邻域中的值设为0 1. 重复前两个步骤,直到检测到所需数量的直线或者低于某一特定的阈值 线检测和链接 1. 找到小的裂口,将其合并 1. 找出比最小阈值长的直线段 例子: {{attachment:figure1010.png}} == 阈值处理 == f(x,y)是原始图像,经过阈值处理后的图像g定义为: {{{#!latex $$g(x, y) = \begin{cases} 1 & if\ f(x,y) \ge T \\ 0 & if\ f(x,y) < T \\ \end{cases}$$ }}} T为阈值。如果T为常数,则称为全局阈值处理。如果允许T发生变化,则称为局部阈值处理。 == 区域分割 == == 分水岭算法 == |
点、线、边缘的检测
点、线、边缘的检测常用空域滤波的方法进行。

1. 检测孤立点
检测孤立点采用的滤波模板是
-1 -1 -1 -1 8 -1 -1 -1 -1
检测的标准是判断滤波后的绝对值是否大于某一阈值

在matlab中可以用如下方法实现:
g = abs(imfilter(f, w)) >= T;
另一种检测方法是看一个邻域内的最大值和最小值的差是否超过某个阈值。实现方法是:
g = imsubtract(ordfilt2(f, m*n, ones(m,n)), ordfilt2(f, 1, ones(m,n))) >= T;
2. 线检测
线检测的模板可以是:
如果对某一方向的线感兴趣,可以使用相应的模板做滤波后进行阈值处理。
3. 边缘检测
边缘所满足的条件:
- 像素值的一阶导数的绝对值大于指定阈值
- 像素值的二阶导数有零交叉。
Sobel:
![$$g = \sqrt{ [(z_7+2z_8+z_9) - (z_1 + 2z_2 + z_3)]^2 + [(z_3+2z_6+z_9)-(z_1+2z_4+z_7))]^2 }$$ $$g = \sqrt{ [(z_7+2z_8+z_9) - (z_1 + 2z_2 + z_3)]^2 + [(z_3+2z_6+z_9)-(z_1+2z_4+z_7))]^2 }$$](/%E5%9B%BE%E5%83%8F%E5%A6%82%E4%BD%95%E5%88%86%E5%89%B2?action=AttachFile&do=get&target=latex_819050c07ff20089de1f263893d62a0435beb5cf_p1.png)
g = edge(f, 'sobel', T, dir)
f是输入图像,T是一个阈值,dir是方向('horizontol'或者'vertical'或者'both')
Prewitt:
g = edge(f, 'prewitt', T, dir)
Roberts:
g = edge(f, 'roberts', T, dir)
Laplacian of Gaussian:
g = edge(f, 'log', T, sigma)
sigma为标准差,默认是2。
检测零交叉:
g = edge(f, 'zerocross', T, H)
H指定卷积的模板。
Canny:
g = edge(f, 'canny', T, sigma)
Hough变换
给定(xi,yi)点,经过该点的直线参数a和b满足:yi=axi+b,a为斜率,b为截距。将经过该点的所有可能的a和b画在ab构成的参数坐标系内,可以得到一条直线。
原图像上的直线y = ax+b上所有点在参数空间内对应的直线会交在同一点,这点的坐标就是所求的参数值。
由于a可能为无穷大,所以在计算上不方便。我们将直线方程写成参数形式:

原始图像上的一个点,对应于参数空间上的一条曲线:
例子:
峰值检测:
- 找到最大值,记下它的位置
- 将上一位置周围邻域中的值设为0
- 重复前两个步骤,直到检测到所需数量的直线或者低于某一特定的阈值
线检测和链接
- 找到小的裂口,将其合并
- 找出比最小阈值长的直线段
例子:
阈值处理
f(x,y)是原始图像,经过阈值处理后的图像g定义为:

T为阈值。如果T为常数,则称为全局阈值处理。如果允许T发生变化,则称为局部阈值处理。
区域分割