史蒂夫在图像处理与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(触发器),y(plateau_mask),“*”
抓住离开
这里有一些放大的视图,展示了三种有趣的平台。
Tiledlayout(2,2)
nextdile.
绘图(x,y)
抓住
绘图(x(触发器),y(plateau_mask),“*”
抓住离开
轴([0 40 40 60])
网格
52岁的文本(20“地区最大”,横向=“中心”
nextdile.
绘图(x,y)
抓住
绘图(x(触发器),y(plateau_mask),“*”
抓住离开
轴([40 60 10 30])
网格
文字(47,14,[“地区”“最低”), HorizontalAlignment =“中心”...
VerticalAlignment =“顶级”
文本(55岁,14日(“地区”“最低”), HorizontalAlignment =“中心”...
VerticalAlignment =“顶级”
文字(51,19,[“区域”“最大”), HorizontalAlignment =“中心”...
VerticalAlignment =“底部”
nextdile.
绘图(x,y)
抓住
绘图(x(触发器),y(plateau_mask),“*”
抓住离开
轴([58 69 40 95])
网格
文字(66,83,“高原”,横向=“正确”
文本(64、79、"不是区域的最大值" "不是区域的最小值"],...
HorizontalAlignment =“左”VerticalAlignment =“顶级”
正如我上次展示的,这个函数 imregionalmax 标识区域最大值的位置。这些可以是单个的样本或像素,也可以是平台。看一看:
reg_max_mask = imregionalmax (y);
tiledlayout (2)
nextdile.
绘图(x,y)
轴([-5 105 0 120])
网格
标题(“输入曲线”
nextdile.
情节(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 = @(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 =圆形(g(0:100));
结尾
|
  • 打印
  • 发电子邮件

注释

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。