我一直试图了解轮廓线的水平。
据我了解,函数Z(x,y)的轮廓是(x,y)平面上的一组点,因此Z(x,y)固定为某个常数,该常数值是轮廓 level 。
Matlab文档指出,contourc函数采用一个参数来确定在其上计算轮廓的级别。
我想尝试一下,所以我构建了一个包含10个矩形的图片,每个矩形的深度从0.1开始,直到1.0为止,然后运行轮廓函数,根据输入中指定的级别查看突出显示的轮廓,但结果出乎意料。
例如,我在0.1轮廓级别上运行代码,轮廓函数在picture中生成所有轮廓,不仅是0.1级别的轮廓。
这是用于构造图片并找到其轮廓的Matlab代码:
pic = zeros(500, 500);
val = 0.1;
shift = 40;
for j = 1:10
for i= 50:450
pic(shift*j,i) = val;
end
for i= 50:450
pic(shift*j+25,i) = val;
end
for i = shift*j: shift*j+25
pic(i, 50) = val;
pic(i,450) = val;
end
val = val + 0.1;
end
imshow(pic);
figure(2);
contour(pic, [0.1 0.1]);
如果有人可以帮助我,我将非常感激。
答案 0 :(得分:1)
MATLAB等高线图通过在网格上提供的Z
值之间进行线性插值,将数据X
表示为Y
和Z
的连续函数X
和Y
中的一个。
您生成的网格在整个背景中的值为0
,在网格的各个矩形部分中的值为0.1
,甚至更高。在每个 矩形截面周围,假定相邻背景网格值与您分配的值之间的值呈线性梯度,并且在某个点上,线性梯度始终穿过{{ 1}},并在该点绘制轮廓。
通过添加更多轮廓级别,我们可以更清楚地了解其工作原理:
0.1
如果我们放大到底部三个框的左边缘,则会得到:
对于所有三个框,contour(pic, 0:0.02:0.1)
分别是pic
在框0
和X=49
的旁边。底部的框在X=51
处具有值0.1
,因此X=50
轮廓正好在该位置绘制。
中间框在0.1
到达0.2
,因此从X=50
到0
再回到0.2
的过程导致0
-等高线出现在0.1
,然后又出现在X=49.5
。
顶部的框到达X=50.5
处的0.3
,因此梯度更陡,X=50
的轮廓更接近0.1
处的0
值和X=49
与中间框相比。
TL; DR:如果数据的值位于轮廓级别的两侧,则轮廓总是存在于这些值之间的某个地方。