matlab utiliza la función de transformación gruesa para la detección de carriles

1. Después de importar la imagen, procésela previamente, incluida la imagen en escala de grises, el filtrado, el resaltado de bordes y la binarización. Los métodos de detección de bordes incluyen: 'gaussiano', 'sobel', 'prewitt', 'laplaciano', 'log', 'average', 'unsharp', 'disk', 'motion'.

2. Utilice la función [H,theta,rho] = hough(f3,'RhoResolution', 0.2, 'Theta', -90:0.2:89) para transformar la imagen preprocesada y obtener la matriz H.

3. Utilice la función P=houghpeaks(H,5,'threshold', ceil(0.3*max(H(:)))) para obtener las posiciones de los 5 valores más altos en la matriz H, lo que significa obtener el los más largos que existen en la imagen original.5 líneas rectas.

4. Utilice la función líneas=houghlines(f3,theta,rho,P,'FillGap',20,'MinLength',40) para obtener los puntos finales de las cinco líneas rectas anteriores en la figura.

5. Después de filtrar los segmentos de línea cuya longitud y pendiente no coinciden con el carril real, dibuje una línea para mostrar el carril detectado.

F=imread('D:\Desktop\2.png');
f=rgb2gray(F);
f1=medfilt2(f,[9,9]);              %中值滤波
H=fspecial('log');               
f2=imfilter(f1,H);                 %突出边缘
thresh=graythresh(f2);
f3=imbinarize(f2,thresh);           %二值化
figure(1),imshow(f3);

[H,theta,rho] = hough(f3,'RhoResolution', 0.2, 'Theta', -90:0.2:89);
figure(2),imshow(imadjust(rescale(H)),'XData',theta,'YData',rho,'InitialMagnification','fit');
title('Hough transform');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
colormap(gca,hot);

P=houghpeaks(H,5,'threshold', ceil(0.3*max(H(:))));
x = theta(P(:,2));
y = rho(P(:,1));
plot(x,y,'s','LineWidth',1.5,'Markersize',10,'color','green');

lines=houghlines(f3,theta,rho,P,'FillGap',20,'MinLength',40);
line_length_thred=40;
slope_thred=0.1;
figure(3),imshow(f3);
L= length(lines);
for k=1:L
  xy= [lines(k).point1; lines(k).point2];
  line_length=((xy(1,1)-xy(2,1))^2+(xy(1,2)-xy(2,2))^2)^0.5;
if line_length< line_length_thred
  continue;
end
slope=(xy(1,2)-xy(2,2))/(xy(1,1)-xy(2,1));
if abs(slope)< slope_thred
  continue;
end
line(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
end

La imagen binaria preprocesada es la siguiente:

Encuentre el valor máximo entre las matrices de 5 H después de una gran transformación:

 Se puede observar que (rho, theta) tiene dos valores altos dentro del gráfico alrededor de (100, -50°) y (400,40°).

 De acuerdo con la relación de coordenadas después de una gran transformación en matlab, se puede ver que (rho, theta) es (100, -50°), que es la línea del carril detectada a la derecha. (rho, theta) es (400, 40°), que es exactamente la línea del carril detectado a la izquierda.

Theta detecta valores altos en tres matrices H cercanas a -90° y 90°, lo que indica que se detectan líneas horizontales en la imagen.

 Después de filtrar los segmentos de línea cuya longitud y pendiente no coinciden con el carril real, el carril detectado se muestra como una línea.

Supongo que te gusta

Origin blog.csdn.net/weixin_56832351/article/details/129278880
Recomendado
Clasificación