用MATLAB进行图像处理

图像处理概念、算法和MATLAB

H-Maxima变换的小峰抑制

最后一次 ,我引入了a的概念 地区最大 .今天,我想添加一个概念,使区域极大值更有用:在识别区域极大值之前,抑制非常小的局部极大值,可能只是因为噪声而存在,这些噪声并不重要。这种“小峰抑制”可以用一种叫做 h-maxima变换。 今天感兴趣的功能: imregionalmax imhmax imextendedmax imregionalmin imhmin , imextendedmin
让我们再次从定义开始 地区最大 :具有常数值的像素连接组件 h ,其中与该连接组件相邻的每个像素的值都小于 h .我想用一个一维的例子来详细说明。
y = peaksAndPlateaus;
x = 1:长度(y);
情节(x, y)
轴([-5 105 0 120])
网格
我将使用膨胀和侵蚀来识别高原上的曲线样本。
plateau_mask = (y = = imdilate (y) (1 1 1))) & (y = = imerode (y) (1 1 1)));
Plateau_mask = imdilate(Plateau_mask,[1 1 1]);
持有
情节(x (plateau_mask), y (plateau_mask),“*”
持有
这里有一些放大的视图,展示了三种有趣的平台。
tiledlayout (2, 2)
nexttile
情节(x, y)
持有
情节(x (plateau_mask), y (plateau_mask),“*”
持有
轴([0 40 40 60])
网格
52岁的文本(20“地区最大”HorizontalAlignment =“中心”
nexttile
情节(x, y)
持有
情节(x (plateau_mask), y (plateau_mask),“*”
持有
Axis ([40 60 10 30])
网格
文本(47岁,14日(“地区”“最低”), HorizontalAlignment =“中心”...
VerticalAlignment =“顶级”
文本(55岁,14日(“地区”“最低”), HorizontalAlignment =“中心”...
VerticalAlignment =“顶级”
文本(51岁,19日(“地区”、“最大”), HorizontalAlignment =“中心”...
VerticalAlignment =“底”
nexttile
情节(x, y)
持有
情节(x (plateau_mask), y (plateau_mask),“*”
持有
Axis ([58 69 40 95])
网格
文本(66、83、“高原”HorizontalAlignment =“正确”
文本(64、79、"不是区域的最大值" "不是区域的最小值"],...
HorizontalAlignment =“左”VerticalAlignment =“顶级”
正如我上次展示的,这个函数 imregionalmax 标识区域最大值的位置。这些可以是单个的样本或像素,也可以是平台。看一看:
reg_max_mask = imregionalmax (y);
tiledlayout (2)
nexttile
情节(x, y)
轴([-5 105 0 120])
网格
标题(“输入曲线”
nexttile
情节(x, reg_max_mask)
轴([-5 105 -0.05 1.05])
网格
标题(“imregionalmax输出”
nexttile (2 [2])
情节(x, y)
持有
情节(x (reg_max_mask), y (reg_max_mask),“*”
持有
轴([-5 105 0 120])
网格
标题(“地区maxima高原”
我所尝试的曲线是相对平滑的,平台是完全平坦的。不幸的是, imregionalmax 当输入有一点噪声时,它的用处就大打折扣了。这是因为噪声会在很多地方引入局部极小值 imregionalmax 取最小的局部最大值。让我们试一试。如果我添加了少量的噪音,你甚至无法在情节中看到它:
rng (17)
= y + (0 * randn(size(y))));
clf
情节(x, yn)
轴([-5 105 0 120])
网格
但是现在输出 imregionalmax 看起来完全不同。
reg_max_mask_n = imregionalmax (yn);
情节(x, yn)
持有
情节(x (reg_max_mask_n), yn (reg_max_mask_n),“*”
持有
轴([-5 105 0 120])
网格
现在,在广阔的高原上只有零星的样本被识别为区域极大值,而在小的“肩膀”高原上的样本被标记为区域极大值。我们必须把镜头放大,才能看到为什么会这样。
轴([5 20 49.8 50.1])
轴([62 67 79.9 80.2])
你可以看到,附加的噪声在不同地方引入了极小的局部最大值,这就是抛 imregionalmax 根据我们想让它做什么来判断。

imhmax

这是函数的位置 imhmax 发挥作用了。它计算的是 h-maxima 变换。这个操作本质上抑制了任何小于某个高度( h )。例如,我们只对局部或区域的高度大于5个单位的最大值感兴趣。我们通过调用 imhmax 是这样的:
yn_h = imhmax (yn, 5);
情节(x, yn)
持有
情节(x, yn_h)
持有
轴([-5 105 0 120])
网格
传奇([“原始”“h-maxima变换”])
在输出中 imhmax 其中,宽峰已被夷平,中间比周围高度仅为3的小峰也已被夷平,被淘汰。现在让我们来试一试 imregionalmax 一次。
reg_max_mask_n_h = imregionalmax (yn_h);
情节(x, yn)
持有
情节(x (reg_max_mask_n_h), yn (reg_max_mask_n_h),“*”
持有
轴([-5 105 0 120])
网格
通过这样的计算,我们只识别出了明显高于周围的峰,而这通常是我们感兴趣的。请注意, h-maxima 变换将峰值展开一点,因此上面所示的结果是在每个宽广的平台的左边和右边挑出一点“肩膀”。如果有必要,我们可以做一些后处理来纠正。
还有另一个函数, imextendedmax ,它简单地将h-极大值变换和区域极大值步骤组合成一个函数。如果你对minima感兴趣,你可以使用这些函数的倒置版本: imhmin imregionalmin , imextendedmin
如果你在自己的工作中发现了这些函数的有趣用法,我很乐意听到,所以请留下评论。

效用函数

函数y = peaksAndPlateaus
F = @(x) min(max(1-abs(x/5),0),0.5);
G1 = @(x) 100*f((x-20)/5);
x = (x-80)/5;
g3 = @ 30 * f (x) ((x 50) / 3);
G4 = @(x) 5*f(2*(x-50));
G5 = @(x) 30*f((x-60));
G = @(x) g1(x) + g2(x) + g3(x) + g4(x) + g5(x);
y =圆(g (0:100));
结束
|
  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。