3

我有一个 2d 图像,我有局部最小值出现的位置。我想测量“导致”这些最小值的山谷的宽度。我需要适合这些山谷的圆或椭圆的半径。附在这里的一个例子,山峰轮廓上的深红色线条是我希望找到的。谢谢。

峰宽示例

4

3 回答 3

1

我建议制作一个点列表来描述椭圆边缘的值,也许是通过找到它跨越阈值的所有点。

above = data > threshold

应用一个简单的边缘检测器

edges = EdgeDetector(above)

找到边的坐标

[row,col] = find(edges)

然后应用这个椭圆拟合器http://www.mathworks.com/matlabcentral/fileexchange/3215-fitellipse

于 2012-10-27T18:48:48.757 回答
1

我正在部分扩展@Lucas 的答案。

给定一个阈值t,我会考虑P_m低于t和接近某个m最小值的点f(给定一个特征尺度长度r)。

(你说你的数据是嘈杂的;要区分最小值和谈论井,你需要估计这样r的。在你的例子中,它可以是例如r=4,即最小值之间距离的一半)。

然后你必须为每个井区 P_m考虑一个指标,例如

 metric(P_m) = .5 * mean{ maximum vertical diameter of P_m ,  
                     maximum horizontal diameter of P_m}.

在你metric(P_m) = 2的两个井的照片中。


总的来说,就伪代码而言,您可以考虑

 M := set of local minima of f

 for_each(minimum m in M){

      P_m += {p : d(p,m) < r and f(r)<t}  % say that += is the push operation in a Stack

 }

 radius_of_region_around(m) = metric(P_m);  %
于 2012-10-27T19:22:21.650 回答
1

我在这里假设您可以访问x,yz数据,并且没有处理给定的 JPG(或左右)图像。然后,您可以使用该功能contourc来发挥自己的优势:

% plot some example function
figure(1), clf, hold on    
[x,y,z] = peaks;
surf(x,y,z+10,'edgecolor', 'none')
grid on, view(44,24)

% generate contour matrix. The last entry is a 2-element vector, the last
% element of which is to ensure the right algorithm gets called (so leave 
% it untouched), and the first element is your threshold.
C = contourc(x(1,:), y(:,1), z, [-4 max(z(:))+1]);

% plot the selected points
plot(C(1,2:end), C(2,2:end), 'r.')

然后使用这个超快椭圆拟合工具通过这些点拟合一个椭圆,并找到你想要的椭圆的所有参数。

我建议您阅读help contourcdoc contourc找出上述内容的原因,以及您可以将其用于什么其他用途。

于 2012-10-28T10:22:49.883 回答