|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 dapmood 于 2021-4-15 16:54 编辑
* N/ T' i- Q- `) C0 p6 M+ y; j% g% C8 b/ u; r
一、简介! X, O2 R* P* z
1. 点检测
/ G3 c5 p6 Q+ @; Pg = abs(imfilter(tofloat(f), w)) >= T;
| v) j0 q( w2 J5 [. m! m; r' F# }3 T. s& M3 L
1 u. U7 v7 u7 e& P! G' z
, }. x# Z7 D* L; O0 s" pf 是输入图像,w 是适合点检测的模板:
/ T' p3 I, H1 F1 q) H' B$ j$ N5 U# [% s+ P4 o' m* i
,g 是包含检测点的图像。imfilter 把输出转换为输入所属的类,如果输入是整数类,并且 abs 操作不接受整数数据,那么在滤波操作中用 tofloat(f)来防止对数值的过早截取。输出图像 g 是 logical 类;值是 0 和 1。如果 T 值没有给出,那么通常基于滤波结果来选取。在那种情况下,先前的一串指令分成三个基本步骤:1) 计算滤波后的图像 abs(imfilter(tofloat(f),w));2) 从滤波后的图像的数据中找出 T 的值;3) 把滤波后的图像与T做比较。
, Z0 S' e1 b8 y5 d2 J$ M0 z3 c3 c$ H! x* x+ f
2.线检测
% {0 ?+ b4 f5 m) K# l$ T- fg = imfilter(tofloat(f), w);
0 f1 v' U ^1 A! L" E其中w为线检测模板:1 g) j) G( @ Z- _& k; q; W7 U
$ Y8 B- ~; ^: }: v$ b/ C& y
. m) ?5 ]# Y$ |; z& L* [# ], L, A
7 u5 P/ F) P7 c* |: p9 R6 U1 S
如果图中的第一个模板在图像上移动,就会对水平线(一个像素宽)的响应更强烈。对于恒定的背景,当线通过模板的中间一行时可能产生更大的响应。同样,图 中的第 2 个模板对+45°线响应最好,第 3 个模板对垂直线响应最好,第 4 个模板对 –45°线响应最好。注意,每个模板的优先方向都用比其他可能方向要大的系数加权。每个模板的系数之和为 0,这表明在恒定亮度区域中,模板的响应为 0。若每方向模板都应用于同一图像,其中一方向模板在图像中心点响应比其他模板在图像中心点响应都大,我们就说那个点与模板 i 方向的线更相关。
$ P* T; ? T I4 V
% q& ^ m' y) g" }- =imread('gantrycrane.png');
- I=rgb2gray(I);
- h1=[-1, -1. -1; 2, 2, 2; -1, -1, -1];
- h2=[-1, -1, 2; -1, 2, -1; 2, -1, -1];
- h3=[-1, 2, -1; -1, 2, -1; -1, 2, -1];
- h4=[2, -1, -1; -1, 2, -1; -1, -1, 2];
- J1=imfilter(I, h1);
- J2=imfilter(I, h2);
- J3=imfilter(I, h3);
- J4=imfilter(I, h4);
- J=J1+J2+J3+J4;
- h=figure;
- set(h,'color','white')
- subplot(121); imshow(I);
- subplot(122); imshow(J);
# u2 w/ }" z' O' |2 f0 ~ Q 5 V3 ~% v: r# S; l
8 X) _( c- H5 D2 p. S
r" f0 v0 ?5 c+ M9 H1 X0 q
7 ?% Q( L+ d, T( f3.边缘检测: E$ l- X# D, E+ }# k
u- g& D0 q. g! p% m; A[g,t]=edge(f, ‘method’, parameters)
+ ]- C. O5 U7 l0 w" C- ~/ ~: d, ^: P9 |$ s+ h" X! Z
f 是输入图像,method 是以下列出方法中的一种,parameters 是下边说明/ l8 a5 S( |! _. X z
! h; d* j Y3 u) }; F
的附加参数。输出 g 是在 f 中被检测到的边缘点的位置为 1,而在其他地方为 0 的逻辑数组。
m: p& c! [) S$ A
$ |1 {" _" R2 D5 ]: k1 R参数 t 是可选择的;由 edge 给出阈值,以决定哪个梯度值足够大到可以被称作边缘点。
, |2 P2 i. X+ y# J/ l$ C9 l) H; \6 {' o/ L
(1)Sobel 边缘检测算子
d& H6 c# }2 c- m6 o) g8 S G# K2 D
Sobel 检测算子的一般调用语法是:[g,t] = edge(f, ‘sobel’, T, dir);6 _# p5 }3 O% I$ z( v5 R: [/ {" Y8 ?
, L1 a6 g2 Z) X/ z2 `2 b- \ Y其中 f 是输入图像,T 是指定的阈值,dir 是指定的检测边缘的首选方向:’horizontal’、 ‘vertical’或’both’(默认值)。" s0 u* N4 Q: j1 p* b+ J
" @7 @3 D0 x& M3 Z(2)Prewitt 边缘检测算子; T Q$ A/ D) g. o4 I
8 W' u9 f4 R: E, C7 @: D3 z一般调用语法是:[g,t] = edge(f, ‘prewitt’, T, dir);
- P6 ^* `: Z( F/ y2 l( P0 P. G; F" f3 K+ c6 @, m( P6 l
这个函数的参数和 Sobel 参数相同。Prewitt 检测算子相比 Sobel 检测算子在计算上要简单一点,但是比较容易产生噪声。
' [( l4 I7 j6 S' G+ v6 P6 Y
; }7 I# [1 A* i8 Z(3)Roberts 边缘检测算子
! {6 J/ ^# B0 U5 c
5 z7 h" _) J: K# g/ C _2 S q4 h j一般调用语法是:[g,t] = edge(f, ‘roberts’, T, dir);
- J) A. N+ T) t x
4 U2 W# m' P& e+ A. v, b这个函数的参数和 Sobel 参数相同。Roberts 检测算子是数字图像处理中最古老的边缘检测算子中的一种,并且也是最简单的一种。因为在部分功能上有限制,所以这种检测算子的使用明显少于其他几种算子(比如,Roberts 检测算子是非对称的,而且不能检测诸如 45°倍数的边缘)。然而,在简单和速度为主导因素的情况下,Roberts 检测算子还是经常用在硬件实现方面。
5 i# ^% J$ d# w/ o& W4 Y& J. s9 F0 l7 e& Q% ^
(4) LoG 检测算子
5 ~$ O7 P& z; E# s3 x9 R) M8 e$ j% o8 o: X
LoG 检测算子的一般调用语法是:[g,t ]= edge(f, ‘log’, T, sigma);
9 r) { }. L9 d: [
* P% K5 q3 a5 w. a; u4 W, V/ @2 w其中的 sigma 是标准差,其他参数和前边解释过的一样。sigma 的默认值是 2。和以前一样,edge 忽略一切不比 T 强的边缘。如果 T 值没有给出或为空[ ],edge 会自动选值。将 T置为 0,将产生封闭的轮廓,这是我们熟知的 LoG 方法的典型特征。7 E y& Q, v% N. U5 [
) j% m3 z; G0 `" N- P f" T' I
(5)零交叉检测算子* d& ]. R5 G6 Z- v
8 U+ l7 ]1 E4 L$ A这种检测算子基于的概念与 LoG 方法相同,但是卷积使用特殊的滤波函数 H 来完成,调用语法为:[g,t] = edge(f, ‘zerocross’, T, H);
9 I& J4 I/ m6 }% ]; ^ ]- z' a g' z: z8 ^6 m9 |6 T
其他参数和 LoG 解释的一样。
& j% q; i- R8 x! E/ x! i) f7 ~( v' [' f8 U3 j2 W
(6)Canny 检测算子6 ?# D# K7 y7 b. o: [
: `- z6 f9 S* {
Canny检测算子(Canny[1986])是 edge 函数中最强的边缘检测算子。Canny检测算子的语法是:[g,t] = edge(f, ‘canny’, T, sigma);
& b* q, R+ y% K) q$ R8 R
/ z( Z1 m1 v, N4 B4 ~, F4 c在这里,T 是向量。T=[T 1 ,T 2 ],包含在前边步骤 3)的两个阈值,sigma 是平滑滤波器的标准差。如果 t 包括在输出参量中,t 就是二元矢量,其中包含该算法用到的两个阈值。语法中的其余参数和其他方法中解释的一样,包括:如果 T 没有指定,就自动计算阈值。sigma 的默认值是 1。4 }7 L" ^6 _ i
+ h+ w/ ^2 ?# d' w
c: E: c) Z' t0 L7 g, _8 V
二、源代码; Z7 D0 Q+ A/ D5 l* P/ ~
- I=imread('cameraman.tif');
- I=im2double(I);
- [J, thresh]=edge(I, 'prewitt', [], 'both');
- h=figure;
- set(h,'color','w')
- subplot(121); imshow(I);
- subplot(122); imshow(J);4 t- m$ q, K1 E/ }% D( V- ~' N
( M2 n. q. P9 \1 w2 J6 E- v8 _) `) M9 K6 D+ }5 \4 A u
$ E0 e5 u; m; Z0 U
; q3 Q) u+ h# n7 H: P) I* ~% X8 f6 M; K+ C) K7 u9 s8 Q% K& g
9 E+ ^- E* W9 `9 \: L T/ g5 K8 x# `: H3 P0 V
|
|