识别所有共线线段(在matlab中)

识别所有共线线段(在matlab中),matlab,image-processing,line-segment,Matlab,Image Processing,Line Segment,我在这里发布了一个相关但不相同的问题 背景: 我有很多这样的图片: 我想确定所有共线的线段,然后测量这些线段的长度。在上面的图像中,有3对线段位于具有负斜率的假想线上。 最长的线段没有一对,因此不考虑它,即必须至少有2条线段共线 我得到以下信息: 为了获得合理的性能,我不得不对参数进行调整(尽管我无法找到一个参数来捕获位于底部的段的起始位)。但是,我无法避免发现多个重叠的段 谁能帮帮我吗 1.防止识别重叠段。 2.识别所有共线的线 非常感谢 此代码查找共线行组 theta = zeros(l

我在这里发布了一个相关但不相同的问题

背景: 我有很多这样的图片:

我想确定所有共线的线段,然后测量这些线段的长度。在上面的图像中,有3对线段位于具有负斜率的假想线上。 最长的线段没有一对,因此不考虑它,即必须至少有2条线段共线

我得到以下信息:

为了获得合理的性能,我不得不对参数进行调整(尽管我无法找到一个参数来捕获位于底部的段的起始位)。但是,我无法避免发现多个重叠的段

谁能帮帮我吗 1.防止识别重叠段。 2.识别所有共线的线


非常感谢

此代码查找共线行组

theta = zeros(length(lines),1);
rho   = zeros(length(lines),1);
for k = 1:length(lines)
  xy = [lines(k).point1; lines(k).point2];
  plot(xy(:,1),xy(:,2),'LineWidth',1,'Color','green');
  plot(xy(1,1),xy(1,2),'x','LineWidth',1,'Color','yellow');
  plot(xy(2,1),xy(2,2),'x','LineWidth',1,'Color','red');
  %text(xy(1,1),xy(1,2),['    ' num2str(k)],'fontsize',10,'color',[1 1 1]);
  theta(k) = lines(k).theta;
  rho(k) = lines(k).rho;
end

theta_tolerance = 2;
theta2 = abs(bsxfun(@minus, theta, theta')) <= theta_tolerance;
theta2(1:size(theta2,2)+1:numel(theta2)) = 0; % zero diagonal
rho_tolerance = 1;
rho2 = abs(bsxfun(@minus, rho, rho')) <= rho_tolerance;
rho2(1:size(rho2,2)+1:numel(rho2)) = 0; % zero diagonal
rhotheta2 = sparse(rho2 & theta2);
[nc, C] = graphconncomp(rhotheta2);


paired = ismember(C,find(hist(C,1:max(C))>1)); % paired lines
colors=get(gcf,'DefaultAxesColorOrder');
for line=find(paired)
    xy = [lines(line).point1; lines(line).point2];
    plot(xy(:,1),xy(:,2),':','LineWidth',4,'Color',colors(C(line),:));
    text(xy(1,1),xy(1,2),num2str(C(line)),'fontsize',20,'Color',colors(C(line),:));
end

theta=0(长度(行),1);
rho=零(长度(线),1);
对于k=1:长度(线)
xy=[行(k).point1;行(k).point2];
绘图(xy(:,1),xy(:,2),“线宽”,1,“颜色”,“绿色”);
绘图(xy(1,1),xy(1,2),'x','LineWidth',1,'Color','yellow');
绘图(xy(2,1),xy(2,2),'x','LineWidth',1,'Color','red');
%文本(xy(1,1),xy(1,2),['num2str(k)],'fontsize',10,'color',[1]);
θ(k)=线(k)。θ;
rho(k)=线(k)。rho;
结束
θu公差=2;

θ2=abs(bsxfun(@减号,θ,θ’)(对于2:)您能只选择一个线段,找到它的斜率,并检查其他具有类似(在一定公差范围内)斜率的线段吗?我知道这不考虑平行段,但您可以尝试使用斜率+/-公差定义的某种ROI来消除其他段产生误报。您将如何处理第一段和第二段相交的3个共线段的情况?是否需要考虑包含第一和第三的集合以及包含第二和第三片段的集合?@ CyBrg当2个片段相交时,它们是同一个片段的一部分(因为在我们的实验中这种交叉并不常见)。但是,我不确定使用什么策略来丢弃两个或多个相交段中的一个。有什么想法吗?非常感谢您的回复。它几乎回答了我的问题。现在只剩下一个问题——你知道如何防止识别重叠区域吗?例如,在您的图像中,标记为6和2的线段实际上是同一个线段——似乎有一个小变形会混淆线段标识。是否可以修改我之前的评论不完整的段标识。非常感谢您非常有帮助的回复。你知道如何防止识别重叠区域吗?例如,在您的图像中,标记为6和2的线段实际上是同一线段的一部分——一个小的拐点会混淆houghline算法。是否有可能修改段标识,以允许一点变形?我也不确定,即使在识别了相交段之后,如何决定忽略哪条线?然而,通过目视检查,可以清楚地看出,只有3对线段。
theta = zeros(length(lines),1);
rho   = zeros(length(lines),1);
for k = 1:length(lines)
  xy = [lines(k).point1; lines(k).point2];
  plot(xy(:,1),xy(:,2),'LineWidth',1,'Color','green');
  plot(xy(1,1),xy(1,2),'x','LineWidth',1,'Color','yellow');
  plot(xy(2,1),xy(2,2),'x','LineWidth',1,'Color','red');
  %text(xy(1,1),xy(1,2),['    ' num2str(k)],'fontsize',10,'color',[1 1 1]);
  theta(k) = lines(k).theta;
  rho(k) = lines(k).rho;
end

theta_tolerance = 2;
theta2 = abs(bsxfun(@minus, theta, theta')) <= theta_tolerance;
theta2(1:size(theta2,2)+1:numel(theta2)) = 0; % zero diagonal
rho_tolerance = 1;
rho2 = abs(bsxfun(@minus, rho, rho')) <= rho_tolerance;
rho2(1:size(rho2,2)+1:numel(rho2)) = 0; % zero diagonal
rhotheta2 = sparse(rho2 & theta2);
[nc, C] = graphconncomp(rhotheta2);


paired = ismember(C,find(hist(C,1:max(C))>1)); % paired lines
colors=get(gcf,'DefaultAxesColorOrder');
for line=find(paired)
    xy = [lines(line).point1; lines(line).point2];
    plot(xy(:,1),xy(:,2),':','LineWidth',4,'Color',colors(C(line),:));
    text(xy(1,1),xy(1,2),num2str(C(line)),'fontsize',20,'Color',colors(C(line),:));
end