Определите все коллинеарные линейные сегменты (в Matlab) - PullRequest
8 голосов
/ 01 декабря 2011

Я разместил связанный, но не тот же вопрос здесь https://stackoverflow.com/questions/8279698/measuring-length-of-dna-fibers-from-an-image-of-single-molecules

Справочная информация: У меня есть много изображений, которые выглядят так: enter image description here

Я хотел бы определить все отрезки, которые являются линейными, а затем измерить длину этих отрезков. На изображении выше есть 3 пары сегментов, которые находятся на воображаемой линии с отрицательным наклоном. Самый длинный отрезок линии не имеет пары, поэтому он не будет рассматриваться, т. Е. Должно быть как минимум 2 отрезка, которые являются коллинеарными.

Я получаю следующее: enter image description here

I  = imread('http://dl.dropbox.com/u/18072545/c_39_green.tif'); 
BW = edge(I,'canny');
[H,T,R] = hough(BW);
NUMPEAKS=15;
PEAKTHRESHOLD= 80; 
SUPPRESSNHBR=[40 40];
P  = houghpeaks(H,NUMPEAKS,'threshold',PEAKTHRESHOLD,'NHoodSize',SUPPRESSNHBR); 
MINLENGTH_OF_SEGMENT=50;
GAPLENGTH_TO_MERGE=30;
lines = houghlines(BW,T,R,P,'FillGap',GAPLENGTH_TO_MERGE,'MinLength',MINLENGTH_OF_SEGMENT);
max_len = 0;
figure, imshow(I), hold on
for k = 1:length(lines)
  xy = [lines(k).point1; lines(k).point2];
  plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
  plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
  plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
end

Мне пришлось поиграться с параметрами, чтобы получить приемлемую производительность (хотя я не могу найти параметр, который будет захватывать начальный бит сегмента, который находится внизу). Однако я не могу не найти несколько перекрывающихся сегментов.

Может кто-нибудь, пожалуйста, помогите мне 1. Предотвратить идентификацию перекрывающихся сегментов. 2. Определите все линии, которые являются линейными

Большое спасибо!

1 Ответ

6 голосов
/ 01 декабря 2011

Этот код находит коллинеарные группы линий.

enter image description here

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

Это не заботится о перекрытии.Непонятно, как хотите обработать случай с 3-мя коллинеарными сегментами, где первый сегмент и второй сегмент пересекаются?Нужно ли рассматривать как набор, содержащий первый и третий, так и набор, содержащий второй и третий сегмент?

...