Matlab 从直线中提取有序点

Matlab 从直线中提取有序点,matlab,line,corner-detection,Matlab,Line,Corner Detection,我有一个由线条组成的bw图像,我正试图从中提取“关键”点。也就是说,我试图提取一个有序的点列表,这样连接相邻的点应该返回接近原始输入的内容 我首先尝试使用C=corner(I)和变体检测角点。这些检测到的优点是无序的,所以没有达到我想要的 我目前有一段代码,它给出了有序列表,但是没有提取足够的点来描述图像。附件是示例图像和代码: I = imbinarize(rgb2gray(imread('rightRaw.png'))); % Read image ad convert to binary

我有一个由线条组成的bw图像,我正试图从中提取“关键”点。也就是说,我试图提取一个有序的点列表,这样连接相邻的点应该返回接近原始输入的内容

我首先尝试使用
C=corner(I)
和变体检测角点。这些检测到的优点是无序的,所以没有达到我想要的

我目前有一段代码,它给出了有序列表,但是没有提取足够的点来描述图像。附件是示例图像和代码:

I = imbinarize(rgb2gray(imread('rightRaw.png'))); % Read image ad convert to binary

J = padarray(I, [1, 0], 1, 'post'); % Insert row of ones at the bottom

J = imfill(J, 'holes'); % Fill inner pixels.
J(end, :) = J(end, :) & J(end-1, :); % Keep only the closing line at the bottom 

% Get X,Y coordinates of all white points 
[Y, X] = find(J > 0);

% Get boundary of the set of points
k = boundary(X, Y);

% Get x,y coordinates of the boundary
x = X(k);
y = Y(k);

% Remove coordinated of bottom line
x = x(y < size(J, 1));
y = y(y < size(J, 1));
I=imbinarize(rgb2gray(imread('rightRaw.png'));%读取图像ad转换为二进制
J=焊盘阵列(I[1,0],1,'post');%在底部插入一行
J=填充(J,‘孔’);%填充内部像素。
J(end,:)=J(end,:)&J(end-1,:);%只保留底部的结束线
%获取所有白点的X,Y坐标
[Y,X]=find(J>0);
%获取点集的边界
k=边界(X,Y);
%获取边界的x,y坐标
x=x(k);
y=y(k);
%去掉底线
x=x(y
结果如下(白色线条,蓝色点)

如您所见,连接相邻点根本无法很好地描述图像。我认为问题在于我使用的是
boundary
。有没有一种方法可以保存所有边的信息,这样我也可以得到内部线?其中可能会有多种形状和线条

我基本上希望
角点
检索到相同的点,但是保留顺序

这是我的原件的复印件:

@烧杯:


我似乎以前见过这个问题。你能发布你的原始图像吗?您希望图像左侧两个弧连接的位置的顺序是什么?我已经添加了原始图像的副本。理想情况下,这将被分成3组独立的点。第一个表示左侧的曲线,下一个表示圆弧,最后一个表示右侧的曲线。一旦我有了3个点的列表,对于每个列表,我应该能够连接相邻的点,并且结果应该与原始列表中的“相似”description@beaker更新已经完成:)我的第一个想法是对二值化图像(或者可能是
角返回的点
)进行深度优先搜索,在每个步骤中首先选择最近的点。您的图像几乎是一条路径,因此这可能会留下一些散乱的像素作为自己的路径。如果你不想要这些,你总是可以过滤掉一定长度下的路径。有没有一种方法可以让我得到多组分数。我不太确定这到底是什么样子,但你的想法听起来很有希望。我所做的一切都只给了我界限。你知道二进制搜索可能是什么样子吗?此外,图像本身可能比显示的图像复杂得多。它可以有边界,边界内的形状etcI似乎以前见过这个问题。你能发布你的原始图像吗?您希望图像左侧两个弧连接的位置的顺序是什么?我已经添加了原始图像的副本。理想情况下,这将被分成3组独立的点。第一个表示左侧的曲线,下一个表示圆弧,最后一个表示右侧的曲线。一旦我有了3个点的列表,对于每个列表,我应该能够连接相邻的点,并且结果应该与原始列表中的“相似”description@beaker更新已经完成:)我的第一个想法是对二值化图像(或者可能是
角返回的点
)进行深度优先搜索,在每个步骤中首先选择最近的点。您的图像几乎是一条路径,因此这可能会留下一些散乱的像素作为自己的路径。如果你不想要这些,你总是可以过滤掉一定长度下的路径。有没有一种方法可以让我得到多组分数。我不太确定这到底是什么样子,但你的想法听起来很有希望。我所做的一切都只给了我界限。你知道二进制搜索可能是什么样子吗?此外,图像本身可能比显示的图像复杂得多。它可以有边界,边界内有形状等