2017-05-06 2 views
3

Problem: Finden Sie eine unerwünschte Zeile in einem Bild mit Hough-Transformation.Auswahl Zeile mit Hough-Transformation

enter image description here

ich folgendes getan,

  1. Richtungsfilter Anwenden 12 verschiedene Richtungen zu analysieren, gedreht mit Bezug auf 15 ° zueinander.
  2. Anwenden von Schwellenwertbildung, um 12 Binärbilder zu erhalten.

enter image description here

Jetzt muss ich in gelb markiert eine dieser beiden Bilder auszuwählen. Coz, die Linien in diesen beiden Bildern sind die prominentesten.

Ich habe den folgenden Code ausprobiert. Es scheint nicht zu funktionieren.

MATLAB-Code

% Read 12 images into workspace. 
input_images = {imread('1.png'),imread('2.png'),imread('3.png'),... 
    imread('4.png'),imread('5.png'),imread('6.png'),... 
    imread('7.png'),imread('8.png'),imread('9.png'),... 
    imread('10.png'),imread('11.png'),imread('12.png')}; 

longest_line = struct('point1',[0 0], 'point2',[0 0], 'theta', 0, 'rho', 0); 

for n=1:12 
    %Create a binary image. 
    binary_image = edge(input_images{n},'canny'); 

    %Create the Hough transform using the binary image. 
    [H,T,R] = hough(binary_image); 

    %Find peaks in the Hough transform of the image. 
    P = houghpeaks(H,3,'threshold',ceil(0.3*max(H(:)))); 

    %Find lines 
    hough_lines = houghlines(binary_image,T,R,P,'FillGap',5,'MinLength',7);   
    longest_line = FindTheLongestLine(hough_lines, longest_line); 
end 


% Highlight the longest line segment by coloring it cyan. 
plot(longest_line.point1, longest_line.point2,'LineWidth',2,'Color','cyan'); 

.

Relevant Source Code

function longest_line = FindTheLongestLine(hough_lines , old_longest_line) 
%FINDTHELONGESTLINE Summary of this function goes here 
% Detailed explanation goes here 
    longest_line = struct('point1',[0 0] ,'point2',[0 0],'theta', 0, 'rho', 0); 

    max_len = 0; 

    N = length(hough_lines); 

    for i = 1:N 
     % Determine the endpoints of the longest line segment 
     len = LenthOfLine(hough_lines(i)); 

     if (len > max_len) 
      max_len = len; 
      longest_line = hough_lines(i); 
     end 
    end 

    old_len = LenthOfLine(old_longest_line); 
    new_len = LenthOfLine(longest_line); 

    if(old_len > new_len) 
     longest_line = old_longest_line; 
    end 
end 

function length = LenthOfLine(linex) 
%LENTHOFLINE Summary of this function goes here 
% Detailed explanation goes here 

    length = norm(linex.point1 - linex.point2); 
end 

Testbilder

Hier sind die 12 Bilder, drive.google.com/open?id=0B-2FDw63ZNTnRnEzYlNyS0V4YVE

+1

Können Sie das Problem mit Ihrem Code erklären und/oder die bereitgestellte Antwort? – m7913d

+0

@ m7913d, mein Code schlägt fehl, die gewünschte bestimmte Zeile auszuwählen. Ich konnte die gegebene Antwort auch nicht funktionieren lassen. – anonymous

+0

Was ist die Ausgabe Ihres Algorithmus? Können Sie die Binärbilder separat hochladen? Anstatt nach der längsten Zeile zu suchen, kann es nützlich sein, die Zeile mit dem höchsten Hough-Transformationswert auszuwählen. – m7913d

Antwort

1

Das Problem mit Ihrem Code ist das FillGap Eigentum von houghlines. Sie sollten größere Lücken in den zurückgesendeten Zeilen zulassen, da die gesuchte Zeile nicht kontinuierlich sein muss, z. 500:

Dies findet die größte Zeile in Bild 7 wie gewünscht.

Visualisierung

die gefundene Zeile auf dem Bild zu zeichnen, können Sie den folgenden Code verwenden:

figure 
imshow(input_images{7}); 
hold on 
% Highlight the longest line segment by coloring it cyan. 
plot([longest_line.point1(1) longest_line.point2(1)], [longest_line.point1(2) longest_line.point2(2)],'LineWidth',2,'Color','cyan'); 

enter image description here

maximale Spitze in Hough Trans Finding

Als Alternative Alternativ können Sie die Zeile auswählen, die dem größten Hough-Transformationswert entspricht, anstatt der längsten Zeile. Dies kann durch die Wahl der longest_line erfolgen wie folgt:

longest_line = ... 
largest_H = 0; % init value 

for n=1:12 
    binary_image = edge(input_images{n},'canny'); 
    [H,T,R] = hough(binary_image); 
    P = houghpeaks(H,1,'threshold',ceil(0.3*max(H(:)))); 
    hough_lines = houghlines(binary_image,T,R,P,'FillGap',500,'MinLength',7);   

    if (largest_H < H(P(1, 1), P(1, 2))) 
     largest_H = H(P(1, 1), P(1, 2)); 
     longest_line = hough_lines(1); 
     longest_line.image = n; 
    end 
end 

Dies wählt die folgende Zeile in Bild 6, die das andere erlaubt Ergebnis ist:

enter image description here

+0

Im zweiten Fall muss ich dies tun, wenn ich nur einen Peak auswählen? Coz, wenn ich nur einen Peak auswählen, wird der größte Peak automatisch ausgewählt. Ist das nicht so? Zum Beispiel kann ich schreiben: 'peaks_count = 1; P = houghpeaks (H, peaks_count, 'Schwelle', ceil (0.3 * max (H (:)))); ', und dann nicht nach dem größten Hough-Wert suchen? – anonymous

+0

Nein, weil Sie den größten Gipfel über alle Bilder finden möchten. – m7913d

+0

Könnten Sie bitte Ihren zweiten Code etwas klarer machen? Ich bin fast da. – anonymous

1

können Sie versuchen, die Hough-Funktionen Ändern von Parametern entsprechend Ihren spezifischen Problem, es ist keine perfekte Lösung, aber es kann gut genug für Sie sein:

img = im2double(rgb2gray(imread('line.jpg'))); 
% edge image 
BW = edge(img,'canny'); 
% relevant angles (degrees) interval for the line you want 
thetaInterval = -80:-70; 
% run hough transform and take single peak 
[H,T,R] = hough(BW,'Theta',thetaInterval); 
npeaks = 1; 
P = houghpeaks(H,npeaks); 
% generate lines 
minLen = 150; % you want the long line which is ~250 pixels long 
% merge smaller lines (same direction) within gaps of 30 pixels 
fillGap = 30; 
lines = houghlines(BW,T,R,P,'FillGap',fillGap,'MinLength',minLen); 
% plot 
imshow(img); 
hold on 
xy = [lines.point1; lines.point2]; 
plot(xy(:,1),xy(:,2),'g','LineWidth',2); 

enter image description here

+0

können Sie Ihren Code bitte erklären? Ich meine, die Gründe hinter sich ändernden Parametern. – anonymous

+0

Ich habe Hough-Transformation, ähnlich wie [hier] (https://www.mathworks.com/help/images/hough-transform.html#buh9ylp-26) verwendet, aber verschiedene Parameter verwendet. Die Logik hinter den Parameterwerten wird in den Kommentaren erklärt (natürlich wurden einige der spezifischen Werte durch einige Versuche bestimmt) – user2999345

+0

Ich denke, dieser Code wird nicht für ein anderes Bild funktionieren. – anonymous

Verwandte Themen