如何根据附近的点来清理一组点

1次查看(最近30天)
Kasra Sadatsharifi
Kasra Sadatsharifi 2021年1月29日
编辑: 马特·J 2021年1月31日
嘿,大家,
我有一组点,有些在网格的交点上,有些不在。我想把不在交点上的移走然后取在交点上的平均值。一个例子显示的一部分点是附加的。点是暗的还是亮的并不重要。如果你观察这些点有时在一个交点上有几个点有时只有一个。我对这些点的想法是搜索每个点附近的小区域(欧几里得距离为5像素),看看是否有其他点,然后取坐标的平均值,这将导致一个想要的交点。如果没有,那么它可能是一个错误的检测交叉。这个想法很清楚,但我想知道如何快速完成它(用尽可能少的for循环)。如果你有更好的主意,我很乐意阅读。下面是我的代码。 It's not working properly though. grid size is the size of white lines and tag size is the size of the black squares. because of the surface variation of the object the sizes are changed.
函数new_points = clean_points(点,选择)
% tagsize = 20;
% gridsize = 4
points_close = [];
points_far = [];
[ind_far] = rangesearch(点,点,opt.tagsize * 1.5);
i = 1:长度(ind_far)
far_points_ind = ind_far {};
far_points =点(far_points_ind:);
points_far = [points_far; far_points];
结束
[ind_close] = rangesearch点,点,opt.gridsize /√(2));
i = 1:长度(ind_close)
close_points_ind = ind_close {};
close_points =点(close_points_ind:);
points_close = [points_close; close_points];
结束
clean_points =相交(points_far points_close,“行”);

答案(1)

马特·J
马特·J 2021年1月29日
编辑:马特·J 2021年1月29日
我觉得你应该回到原始图像。一旦你有了原始图像的二值化BW,你可以通过这样做得到网格交叉点的坐标,
[I,J] = find(bwmorph(bwskel(BW)),的分歧点))
4评论
马特·J
马特·J 2021年1月30日
你可以用 uniquetol 如下面的代码所示。然而,如果没有二值化图像,我不知道你将如何决定哪些点离交点太遥远,应该被丢弃。这似乎是你必须从形态学上做的事情。我不知道你对图像的二元化有什么不喜欢的。我可以很容易地在下面做 “自适应”imbinarize (___)
负载(websave (“image.mat”“//www.tatmou.com/matlabcentral/answers/uploaded_files/504458/image.mat”))
B = imbinarize (C,“自适应”);
B = bwareafilt (B(1000年,正));
S = bwskel (B);
英国石油(bp) = bwmorph(年代,的分歧点);
S = bwareafilt(& ~英国石油(bp)[10,正])|英国石油(bp);
= bwskel (imclose(年代,strel (“磁盘”15)));
%reg=regionprops(bwmorph(S,' branchpoints'),'Centroid');
% p0 = vertcat (reg.Centroid);
(I, J) =找到(bwmorph(年代,的分歧点));
p0 = [J,我];
(~, ~, G) = uniquetol (p0, 14日“ByRows”,1,“DataScale”1);
p = splitapply (@ (z)的意思是(z, 1), p0, G);
imshow (C)
持有;散射(p (: 1), p(:, 2), 60岁,“r”“o”“填充”);持有

登录评论。

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!