【问题标题】:Surface from level curves of unkown levels in MATLABMATLAB中未知水平的水平曲线的表面
【发布时间】:2017-11-09 22:38:55
【问题描述】:

我想在每个离散点获得一个近似“高度”的 n*m 矩阵。输入是来自地图的等高线图片(见下面的链接),每条等高线代表高度增加或减少 5m。

我的想法:

  • 我将图片作为逻辑 png 导入到名为 A 的矩阵中,这意味着矩阵中的每条等高线都是由 '1' 组成的连接条,其他所有内容都只是 0。
  • 我最初的想法是从矩阵的左上角开始,将该高度设置为零,声明一个新的矩阵“高度”,然后通过每次遇到一个“增加 5 米”来计算height(:,1) 1' 在A 矩阵中。知道整个第一个冒号,我现在每行从左边开始,每次遇到“1”时增加 5 m。
  • 但是我很快意识到这行不通,因为算法无法理解它是应该增加还是减少高度,即我们是在上坡还是下坡。
  • 如果我能以某种方式从等高线的强度近似梯度,即使上坡总是可能成为下坡,反之亦然,但我可以手动确定这两种情况下哪一个是正确的。

图片:

【问题讨论】:

  • 在您的想法之前,您的数据!你只有一个图像吗?或者你有某种格式的曲线吗?什么格式?
  • 输入数据只是一个图像,它代表了一些未知表面的水平曲线,鉴于我知道每条水平曲线之间的高度差,我想对其进行近似。
  • 所需的输出格式是什么?它是否需要是一个网格,或者它可以是例如。三角形网格?
  • 另外,那是您的原始图像,jpg 吗?还是你有一个png?因为 jpg 有图像伪影
  • 你的图片有问题:没有办法知道一条线是高还是低,你只需要每次猜测,因此有成千上万种可能的解决方案跨度>

标签: matlab image-processing contour


【解决方案1】:

正在进行中

%% Read and binarize the image
I=imread('https://i.stack.imgur.com/pRkiY.jpg'); 
I=rgb2gray(I);
I=I>graythresh(I)*255;

%% Get skeleton, i.e. the lines!
sk=bwmorph(~I,'skel',Inf);

%% lines are too thin, dilate them
dilated=~imdilate(sk, strel('disk', 2, 4));

%% label the image!
test=bwlabel(dilated,8);

imshow(test,[]); colormap(plasma); % use colormap parula if you prefer.

缺失:用数字 +1(或 -1)它的邻居标记每个相邻区域(不知道怎么做)

缺少:插值平坦区域。一旦知道高度,这应该是可行的。可以将骨架图像中的像素设置为海拔高度,然后使用griddata 对其余部分进行插值,这会很慢,但仍然可行。


免责声明:还没有完整的答案,请随时编辑或重用此答案中的代码以进一步解决!

【讨论】:

  • 这正是我第一步所寻找的,谢谢!我意识到,正如你所说,不可能判断一条线是高于还是低于前一条。当线路关闭时,您可能会假设每条线路都代表高度的增加,因为通常情况就是如此。但是,对于未闭合的线路,很难做出假设。即使在某些假设下,仅给定轮廓图片,也可能无法检索出良好的高度表面。
猜你喜欢
  • 2018-11-21
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多