Estoy tratando de hacer que una transformación de Hough funcione en MATLAB, pero tengo problemas. Tengo una forma realmente mala de detectar picos que deben corregirse, pero antes de eso necesito poder revertir la transformación de hough para crear las líneas de nuevo correctamente. Este es el tipo de cosas que estoy recibiendo ahora:
parece que ha girado 90 grados, pero no estoy seguro de por qué. No estoy seguro de si es mi espacio Hough lo que está mal, o si es la forma en que elimino Hough y dibujo las líneas. ¿Alguien podría ayudarme a mejorar mi detección de picos? Las imágenes utilizadas en el código están aquí.
%% 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
Vinculado: ¿Cómo hacer el deshuesado de una imagen transformada de Hough?
matlab
hough-transform
Waspinator
fuente
fuente
Respuestas:
En primer lugar, Matlab tiene una transformación Hough incorporada : no es necesario reinventar la rueda.
Aunque su imagen no requiere necesariamente la detección de bordes, podría mejorar el tiempo de procesamiento y la efectividad del algoritmo que uso. Tu triángulo tiene regiones gruesas de blanco y negro. Idealmente, el triángulo tendría 1px de grosor marcando los bordes del triángulo. Utilice la detección de bordes de Canny
Existe la posibilidad de que elija el pico incorrecto porque hay picos vecinos que pueden ser más grandes en la matriz del acumulador. Si bien hay muchos algoritmos, aquí hay uno que he visto usado en Hough Transforms en el pasado:
Mire en HoughLines para mostrar las líneas de transformación de hough, resultados:
http://www.mathworks.com/help/toolbox/images/ref/houghlines.html
Efectos del uso de Canny Edge Detector
La detección de bordes puede potencialmente convertir cada lado del triángulo en dos líneas.
El objetivo de la detección de bordes afilados es producir bordes máximos / angostos máximos mediante el uso de supresión no máxima
Canny Edge Detection in a Nutshell (Fuente: Procesamiento de imagen digital, Gonazalez)
fuente
necesita ser cambiado a
para que las líneas funcionen en la profundidad
fuente
La respuesta usando los 3 bucles es menos que óptima y podría mejorarse, aquí hay más de un enfoque / punto de vista intuitivo:
Cada par de puntos válidos establece un a & b único de
y = ax + b
. Una línea tendrá muchos pares con el mismo valor de a & b, por lo que habrá una línea larga como pico. Esto también es cierto para las coordenadas polares r & teta.En lugar de tratar cada punto por separado, use pares de puntos. Si puede almacenar todos los puntos (generalmente escasos) en una lista separada, es mejor, pero no es obligatorio.
Línea larga -> muchos pares con el mismo a, b.
Puntos esporádicos -> recuento pequeño en celdas específicas -> más como desorden.
Otra forma de verlo es desde el punto de vista del radón / proyectivo.
fuente