我有一张2D图像,我有局部最小值出现的位置。 我想测量山谷的宽度“领先”到那些最小值。 我需要圆圈的半径或适合这些山谷的椭圆。 这里附有一个例子,山峰轮廓上的深红色线条是我希望找到的。 感谢。
答案 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)
我假设您在此处可以访问x
,y
和z
数据,并且不会处理给定的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 contourc
和doc contourc
,了解上述原因以及您可以使用的其他原因。