用MATLAB进行图像处理

图像处理概念,算法和MATLAB

H-Maxima变换的小峰抑制

最后一次 ,我介绍了一个概念 地区最大 .今天,我想添加一个概念,使区域极大值更有用:在识别区域极大值之前,抑制非常小的局部极大值,可能只是因为噪声而存在,这是不重要的。这种“小峰值抑制”可以通过使用一种叫做 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),“*”
持有
轴([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),“*”
持有
轴([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])
网格
标题(“区域最大高原”
我一直在试验的曲线是相对平滑的,有一个完全平坦的平台。不幸的是, imregionalmax 当输入有一点噪声时,它的用处就会大大降低。这是因为噪声在许多地方引入了小的局部极大值,而且 imregionalmax 连最小的局部极值都能接收到。我们试试吧。如果我添加一个非常小的噪音,你甚至在图中看不到它:
rng (17)
Yn = y + (0.01 * 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-极大值变换”])
的输出 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-极大值变换和区域极大值步骤组合成一个函数。如果你对极小值感兴趣,那么你可以使用这些函数的倒置版本: imhmin imregionalmin , imextendedmin
如果你在自己的工作中发现了这些函数的有趣用途,我很乐意听到,所以请留下评论。

效用函数

函数y = peaksAndPlateaus
F = @(x) min(max(1-abs(x/5),0),0.5);
G1 = @(x) 100*f((x-20)/5);
G2 = @(x) 200*f((x-80)/5);
G3 = @(x) 30*f((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 = round(g(0:100));
结束
|
  • 打印
  • 发送电子邮件

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그하거나계정을새로만드십시오。