前言
那么這里博主先安利一些干貨滿滿的專欄了!
這兩個都是博主在學(xué)習(xí)Linux操作系統(tǒng)過程中的記錄,希望對大家的學(xué)習(xí)有幫助!
Linux Syshttps://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482這兩個是博主學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的同時,手撕模擬STL標(biāo)準(zhǔn)模版庫各種容器的專欄。操作系統(tǒng)Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482
STL源碼剖析https://blog.csdn.net/yu_cblog/category_11983210.html?spm=1001.2014.3001.5482手撕數(shù)據(jù)結(jié)構(gòu)https://blog.csdn.net/yu_cblog/category_11490888.html
一、摘要?
本次實驗,通過學(xué)習(xí)邊緣檢測的原理,使用Matlab編程語言,完成對輸出給定圖像的邊緣檢測圖像和完成車道線識別。
二、實驗內(nèi)容及目的
輸出給定圖像的邊緣檢測圖像和完成車道線識別。
三、實驗相關(guān)原理描述
邊緣檢測是一種圖像處理技術(shù),用于在圖像中檢測出物體或場景的邊緣或輪廓。其原理是通過分析圖像中的亮度或顏色變化來識別邊緣位置。常用的邊緣檢測方法包括Sobel、Prewitt、Canny等。
下面是本次實驗主要流程:
主要步驟原理?
高斯濾波:
高斯濾波是一種常用的圖像處理技術(shù),用于平滑圖像、去除噪聲和邊緣檢測等應(yīng)用。它基于高斯函數(shù)(也稱為正態(tài)分布函數(shù))的概念,通過對圖像中的像素進(jìn)行加權(quán)平均來實現(xiàn)平滑效果。
高斯濾波的公式如下:
其中,G(x,y) 表示高斯濾波器在坐標(biāo)(x,y) 處的權(quán)重值,σ 表示高斯函數(shù)的標(biāo)準(zhǔn)差,控制了濾波器的模糊程度。標(biāo)準(zhǔn)差越大,濾波器的模糊程度越高。
高斯濾波的原理是利用高斯函數(shù)的權(quán)重值對圖像中的像素進(jìn)行加權(quán)平均。濾波器的中心像素權(quán)重最大,越遠(yuǎn)離中心像素的像素權(quán)重越小。通過對鄰近像素進(jìn)行加權(quán)平均,可以使圖像中的噪聲平均化,并且能夠保留圖像的整體結(jié)構(gòu)和邊緣特征。
Sobel算子計算梯度:
水平方向的 Sobel 算子:
垂直方向的Sobel算子:
這些模板是 3x3 的矩陣,分別對應(yīng)著水平和垂直方向上的微分操作。通過將這些模板與圖像進(jìn)行卷積操作,可以得到圖像在水平和垂直方向上的梯度值。
非極大值抑制:
非極大值抑制可以用來尋找像素點局部最大值,將非極大值所對應(yīng)的灰度值置0,極大值點置1,這樣可以剔除一大部分非邊緣的像素點,從而得到一副二值圖像,邊緣理想狀態(tài)下都為單像素邊緣。
四、實驗過程和結(jié)果
% 讀取圖片
img = imread('圖像路徑');
imshow(img);
% 將圖像轉(zhuǎn)換為灰度
gray_img = rgb2gray(img);
% 高斯濾波
sigma = 2; % 高斯濾波器的標(biāo)準(zhǔn)差
gaussian_filtered_img = imgaussfilt(gray_img, sigma);
% 使用Sobel算子進(jìn)行梯度計算
sobel_filtered_img = double(edge(gaussian_filtered_img, 'sobel'));
% 顯示原始圖像和處理后的圖像
imshow(img); title('原始圖像');
imshow(sobel_filtered_img); title('梯度計算后的圖像');
% 定義梯度方向
directions = [-pi/2, -pi/4, 0, pi/4, pi/2, 3*pi/4, pi, -3*pi/4];
% 對每個像素,找到沿著梯度方向的兩個相鄰像素,計算它們的插值
nms_img = zeros(size(sobel_filtered_img));
for i=2:size(sobel_filtered_img,1)-1
for j=2:size(sobel_filtered_img,2)-1
% 找到最近的兩個方向
[~, index] = min(abs(directions - atan2d(-sobel_filtered_img(i,j), sobel_filtered_img(i,j+1))));
if index == 1 || index == 5
left = sobel_filtered_img(i-1,j-1);
right = sobel_filtered_img(i+1,j+1);
elseif index == 2 || index == 6
left = sobel_filtered_img(i-1,j+1);
right = sobel_filtered_img(i+1,j-1);
elseif index == 3 || index == 7
left = sobel_filtered_img(i,j-1);
right = sobel_filtered_img(i,j+1);
elseif index == 4 || index == 8
left = sobel_filtered_img(i+1,j-1);
right = sobel_filtered_img(i-1,j+1);
end
% 如果像素值是局部最大值,則保留
if sobel_filtered_img(i,j) >= left && sobel_filtered_img(i,j) >= right
nms_img(i,j) = sobel_filtered_img(i,j);
end
end
end
% 顯示非極大值抑制后的圖像
figure; imshow(nms_img); title('非極大值抑制后的圖像');
% 閾值滯后處理
low_threshold = 0.05;
high_threshold = 0.2;
edge_map = zeros(size(nms_img));
edge_map(nms_img > high_threshold) = 1;
for i=2:size(nms_img,1)-1
for j=2:size(nms_img,2)-1
if (nms_img(i,j) > low_threshold) && (edge_map(i,j) == 0)
if (edge_map(i-1,j-1) == 1) || (edge_map(i-1,j) == 1) || (edge_map(i-1,j+1) == 1) || (edge_map(i,j-1) == 1) || (edge_map(i,j+1) == 1) || (edge_map(i+1,j-1) == 1) || (edge_map(i+1,j) == 1) || (edge_map(i+1,j+1) == 1)
edge_map(i,j) = 1;
end
end
end
end
imshow(edge_map);
% 孤立弱邊緣抑制
isolated_threshold = 1;
for i=2:size(edge_map,1)-1
for j=2:size(edge_map,2)-1
if (edge_map(i,j) == 1) && (sum(sum(edge_map(i-1:i+1,j-1:j+1))) <= isolated_threshold)
edge_map(i,j) = 0;
end
end
end
imshow(edge_map);
% 車道線檢測
% [m,n] = size(edge_map)
% x = [1600,0,0,1600];
% y = [1000,0,0,1000];
% mask = poly2mask(x,y,m,n);
% new_img = mask.*edge_map;
% imshow(new_img);
new_img = edge_map;
lines = HoughStraightRecognize(new_img);
hold on;
imshow(img);
for k = 1:length(lines)
% k = 7;
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
function lines = HoughStraightRecognize(BW)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%該函數(shù)為霍夫變換識別直線的函數(shù)
%input:圖像(可以是二值圖,也可以是灰度圖)
%output:直線的struct結(jié)構(gòu),其結(jié)構(gòu)組成為線段的兩個端點
%以及在極坐標(biāo)系下的坐標(biāo)【rho,theta】
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[H,T,R] = hough(BW);
% imshow(H,[],'XData',T,'YData',R,...
% 'InitialMagnification','fit');
% xlabel('\theta'), ylabel('\rho');
% axis on, axis normal, hold on;
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
%x = T(P(:,2)); y = R(P(:,1));
%plot(x,y,'s','color','white');
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
%FillGap 兩個線段之間的距離,小于該值會將兩個線段合并
%MinLength 最小線段長度
end
實驗過程所得到輸出圖像如下圖所示:文章來源:http://www.zghlxwxcb.cn/news/detail-599629.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-599629.html
到了這里,關(guān)于車道線檢測|利用邊緣檢測的原理對車道線圖片進(jìn)行識別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!