Ich versuche, eine Hough-Transformation in MATLAB zum Laufen zu bringen, aber ich habe Probleme. Ich habe eine wirklich schlechte Art, Peaks zu erkennen, die behoben werden müssen, aber vorher muss ich die Hough-Transformation umkehren können, um die Linien wieder richtig zu erstellen. Das ist die Art von Sachen, die ich gerade bekomme:
sieht aus wie um 90 Grad gedreht, aber ich bin mir nicht sicher warum. Ich bin nicht sicher, ob es mein Hough-Raum ist, der falsch ist, oder ob es die Art ist, wie ich Hough entferne und die Linien zeichne. Könnte auch jemand dazu beitragen, meine Peakerkennung zu verbessern? Die im Code verwendeten Bilder sind hier
%% load a sample image; convert to grayscale; convert to binary
%create 'x' image (works well)
a = eye(255);
b = flipud(eye(255));
x = a + b;
x(128,128) = 1;
%image = rgb2gray(imread('up.png')) < 255;
%image = rgb2gray(imread('hexagon.png')) < 255;
%image = rgb2gray(imread('traingle.png')) < 255;
%%% these work
%image = x;
%image = a;
image = b;
%% set up variables for hough transform
theta_sample_frequency = 0.01;
[x, y] = size(image);
rho_limit = norm([x y]);
rho = (-rho_limit:1:rho_limit);
theta = (0:theta_sample_frequency:pi);
num_thetas = numel(theta);
num_rhos = numel(rho);
hough_space = zeros(num_rhos, num_thetas);
%% perform hough transform
for xi = 1:x
for yj = 1:y
if image(xi, yj) == 1
for theta_index = 1:num_thetas
th = theta(theta_index);
r = xi * cos(th) + yj * sin(th);
rho_index = round(r + num_rhos/2);
hough_space(rho_index, theta_index) = ...
hough_space(rho_index, theta_index) + 1;
end
end
end
end
%% show hough transform
subplot(1,2,1);
imagesc(theta, rho, hough_space);
title('Hough Transform');
xlabel('Theta (radians)');
ylabel('Rho (pixels)');
colormap('gray');
%% detect peaks in hough transform
r = [];
c = [];
[max_in_col, row_number] = max(hough_space);
[rows, cols] = size(image);
difference = 25;
thresh = max(max(hough_space)) - difference;
for i = 1:size(max_in_col, 2)
if max_in_col(i) > thresh
c(end + 1) = i;
r(end + 1) = row_number(i);
end
end
%% plot all the detected peaks on hough transform image
hold on;
plot(theta(c), rho(r),'rx');
hold off;
%% plot the detected line superimposed on the original image
subplot(1,2,2)
imagesc(image);
colormap(gray);
hold on;
for i = 1:size(c,2)
th = theta(c(i));
rh = rho(r(i));
m = -(cos(th)/sin(th));
b = rh/sin(th);
x = 1:cols;
plot(x, m*x+b);
hold on;
end
Verknüpft: Wie kann man ein Hough-transformiertes Bild entfernen?
matlab
hough-transform
Waspinator
quelle
quelle
Antworten:
Erstens hat Matlab eine eingebaute Hough-Transformation : Das Rad muss nicht neu erfunden werden.
Obwohl Ihr Bild nicht unbedingt eine Kantenerkennung erfordert, können Sie die Verarbeitungszeit und die Effektivität des Algorithmus verbessern, indem Sie ihn verwenden. Ihr Dreieck hat fette Bereiche in Weiß und Schwarz. Idealerweise ist das Dreieck 1px dick und markiert die Kanten des Dreiecks. Verwenden Sie Canny Edge Detection
Das Ergebnis ist, dass θ im Bereich von Grad liegt, während Ihr Plot (oder ) ist, also subtrahieren Sie Grad ( ).0 < θ < 180 0 < θ < π 90 π / 2- 90 < θ < 90 0 < θ < 180 0 < θ < π 90 π/ 2
Es besteht die Möglichkeit, dass Sie den falschen Peak auswählen, da benachbarte Peaks in der Akkumulatormatrix möglicherweise größer sind. Obwohl es hier viele Algorithmen gibt, habe ich einen gesehen, der in der Vergangenheit in Hough-Transformationen verwendet wurde:
Schauen Sie in HoughLines nach, um die Ergebnisse der Hough-Transformationslinien anzuzeigen:
http://www.mathworks.com/help/toolbox/images/ref/houghlines.html
Auswirkungen der Verwendung von Canny Edge Detector
Die Kantenerkennung kann möglicherweise jede Seite des Dreiecks in zwei Linien umwandeln.
Das Ziel der Canny-Edge-Erkennung besteht darin, durch nichtmaximale Unterdrückung maximal dünne / schmale Kanten zu erzeugen
Canny Edge Detection auf den Punkt gebracht (Quelle: Digital Image Processing, Gonazalez)
quelle
muss geändert werden zu
damit die Leinen im Dehough klappen
quelle
Die Antwort mit den 3 Schleifen ist weniger als optimal und könnte verbessert werden. Hier ist eher eine intuitive Herangehensweise / Sichtweise:
Jedes Paar gültiger Punkte setzt ein eindeutiges a & b von
y = ax + b
. Eine Linie enthält viele Paare mit demselben a & b-Wert, sodass eine lange Linie als Spitze vorhanden ist. Dies gilt auch für polare r & teta; -Koordinaten.Anstatt jeden Punkt einzeln zu behandeln, verwenden Sie Punktpaare. Wenn Sie alle (normalerweise spärlichen) Punkte in einer separaten Liste speichern können, ist dies besser, aber kein Muss.
Lange Schlange -> viele Paare mit dem gleichen a, b.
Sporadische Punkte -> kleine Zählung in bestimmten Zellen -> eher Unordnung.
Eine andere Sichtweise ist aus Radon- / projektiver Sicht.
quelle