如何计算导数为零的直方图上的点?

时间:2016-03-30 22:59:01

标签: matlab image-processing histogram

我使用提供的函数here在直方图上计算了平滑度。根据我的理解,下图中标记为0.5点的点是直方图的导数等于零,即平滑曲线在下降时与仓相交的点。如何在不显示直方图的情况下自动或数字计算此点(通过计算)? enter image description here

1 个答案:

答案 0 :(得分:1)

您可以从示例中删除所有绘图命令。 它归结为以下几点:

y = [randn(1,5001), randn(1,2001)+6];

[heights,centers] = hist(y);
n = length(centers);
w = centers(2)-centers(1);
t = linspace(centers(1)-w/2,centers(end)+w/2,n+1);

dt = diff(t);
Fvals = cumsum([0,heights.*dt]);
F = spline(t, [0, Fvals, 0]);

DF = fnder(F);  % computes its first derivative

现在,您如何获得DF的实际数据点?如果您阅读manual page for fnplt,您会发现将其分配给变量会产生数据点而不会产生图。

pts = fnplt(DF);

现在我们只检查数据的位置> 0以及符号更改的位置:

pts(2, find(diff(pts(1,:) > 0) == -1) + 1)

让我们把它分开:

pts(1,:) > 0

创建一个逻辑向量,其中样条曲线大于0,否则为0。

diff(pts(1,:) > 0)

计算连续元素之间的差异。当pts(1,:)从1更改为0时,这将为-1。使用find,我们可以找到这些转换的位置。这将为我们提供样本在去往或经过0之前仍为正的最后几点。最后,我们添加1以获得符号更改后样条曲线的位置。