测量谷宽2d,matlab

时间:2012-10-27 18:37:07

标签: matlab optimization image-processing

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

peaks width example

3 个答案:

答案 0 :(得分:1)

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

above = data > threshold

应用简单的边缘检测器

edges = EdgeDetector(above)

找到边的坐标

[row,col] = find(edges)

然后应用此椭圆钳工http://www.mathworks.com/matlabcentral/fileexchange/3215-fitellipse

答案 1 :(得分: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);  %

答案 2 :(得分:1)

我假设您在此处可以访问xyz数据,并且不会处理给定的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.')

然后使用this superfast ellipse fitting tool通过这些点拟合椭圆并找到所需椭圆的所有参数。

我建议您阅读help contourcdoc contourc,了解上述原因以及您可以使用的其他原因。