首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从图像中手动提取边界并防止选择的点重叠

从图像中手动提取边界并防止选择的点重叠
EN

Stack Overflow用户
提问于 2019-09-12 02:26:56
回答 1查看 51关注 0票数 3

我正在尝试将图像边界导入CAD建模软件。为此,我从this image中手动选择边界。我使用的代码如下:

代码语言:javascript
复制
I = imread('image.jpg'); %image file name
imshow(I);
uiwait(msgbox('Left click to choose points. Right click to exit')); 

n = 0;
while true
   [x, y, button] = ginput(1);hold on;
   if isempty(x) || button(1) ~= 1; break; end
   n = n+1;
   x_n(n) = x; % save all points you continue getting
   y_n(n) = y;
   plot(x,y,'-o',...
    'LineWidth',2,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[.49 1 .63],...
    'MarkerSize',10);
end
figure;
x_n=x_n';
y_n=y_n';
plot(x_n,y_n);
A=[x_n,y_n];

在计算机辅助设计软件model中,如本image所示,选择边界上的点将产生以下结果。边界中的重叠是由于CAD软件中绘制直线的方式造成的,如下所示:

代码语言:javascript
复制
s1.Line(point1=(-0.131218,39.556604),point2=(1.762436,40.503431))
s1.Line(point1=(1.762436,40.503431),point2=(4.602916,38.136364))
s1.Line(point1=(4.602916,38.136364),point2=(9.337050,31.035163))
s1.Line(point1=(9.337050,31.035163),point2=(11.230703,23.460549))
s1.Line(point1=(11.230703,23.460549),point2=(14.544597,17.779588))
s1.Line(point1=(14.544597,17.779588),point2=(15.491424,12.572041))
s1.Line(point1=(15.491424,12.572041),point2=(16.438250,6.417667))
s1.Line(point1=(16.438250,6.417667),point2=(17.385077,2.156947))
s1.Line(point1=(17.385077,2.156947),point2=(21.645798,5.944254))
s1.Line(point1=(21.645798,5.944254),point2=(26.853345,8.784734))
s1.Line(point1=(26.853345,8.784734),point2=(31.114065,11.625214))
s1.Line(point1=(31.114065,11.625214),point2=(35.848199,13.045455))
s1.Line(point1=(35.848199,13.045455),point2=(40.582333,14.939108))

有没有办法可以通过暂停选择来防止选择过程中的重叠?或者关于如何有效地制作模型的任何其他建议?我曾尝试使用图像处理来确定边界。但我无法想象如何将图像坐标转换为CAD软件模型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-12 05:26:35

可能的解决方案是在选定点之外创建多边形,并且如果存在线交叉,则不将选定点添加到x_ny_n

代码使用polyshape函数创建多边形对象:

代码语言:javascript
复制
clearvars

I = imread('image.jpg'); %image file name
imshow(I);
uiwait(msgbox('Left click to choose points. Right click to exit')); 

warning('Off', 'MATLAB:polyshape:repairedBySimplify'); %Disable warning "Polyshape has duplicate vertices, intersections..."

n = 0;
h_pgon = [];
while true
    [x, y, button] = ginput(1);hold on;
    if isempty(x) || button(1) ~= 1; break; end

    n = n+1;

    %Save points to temporary arrays
    tmp_x_n(n) = x; % save all points you continue getting
    tmp_y_n(n) = y;

    is_overlapping = false;

    if n > 2
        %Check if there is "overlapping during selection":

        %Creates a polygon object
        pgon = polyshape(tmp_x_n, tmp_y_n);

        if (pgon.NumRegions > 1) || (pgon.NumHoles > 0)
            %There are intersections, so don't add the new x, y to x_n, y_n.
            disp('Overlapping!'); %Print "Overlapping!" for testing.
            is_overlapping = true;
            n = n - 1;
        end
    end

    if ~is_overlapping
        %There is no overlapping - copy tmp_x_n, tmp_y_n to x_n, y_n.
        x_n = tmp_x_n;
        y_n = tmp_y_n;

        plot(x,y,'-o',...
            'LineWidth',2,...
            'MarkerEdgeColor','k',...
            'MarkerFaceColor',[.49 1 .63],...
            'MarkerSize',10);        

        %Plot polygon for testing
        if n > 2
            if isobject(h_pgon), delete(h_pgon);end %Delete previouse polygon.
            h_pgon = plot(pgon);
        end
    end   
end

figure;
x_n=x_n';
y_n=y_n';
plot(x_n,y_n);
A=[x_n,y_n];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57894877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档