问题:
在竞速机器人的比赛中,我们使用计算机视觉导航进行跑道路线的识别
目标:
在不同的情况下可以得到采集到的图片中直线的个数,以及直线的斜率,进而判断机器人的具体位置
不同的环境,包括:晴天,阴天,室内,室外,阴影区,和非阴影区,摄像头的曝光区,和非曝光区
具体图片:
该图像包含阴影区和反光区
先进行RGB到灰度图的转换
clear all;
close all;
clc
img = imread('1.jpg');
img = imresize(img,[240,320]);
%%
%先进行颜色空间的转换
[row col dim] = size(img);
T = zeros([row ,col]);
A = [0.299 0.587 0.114];
for i=1:row
for j=1:col
B = [img(i,j,1) img(i,j,2) img(i,j,3)]';
T(i,j) = A*double(B);
end
end
new_img = uint8(T);
figure ;imshow(new_img);title('自己转换的图片');
紧接着进行阈值分割点的查找
%%
%进行阈值分割
Grade_Level = zeros(1,256);
for x = 1:row
for y = 1:col
Grade_Level(new_img(x,y)+1) = Grade_Level(new_img(x,y)+1) + 1;
end
end
figure;plot(1:256,Grade_Level);title('灰度直方图');
%%
%寻找分割点
num_bins=256;
counts = Grade_Level(:);
p = counts / sum(counts);
omega = cumsum(p);
mu = cumsum(p .* (1:num_bins)');
mu_t = mu(end);
sigma_b_squared = (mu_t * omega - mu).^2 ./ (omega .* (1 - omega));
% Find the location of the maximum value of sigma_b_squared.
% The maximum may extend over several bins, so average together the
% locations. If maxval is NaN, meaning that sigma_b_squared is all NaN,
% then return 0.
maxval = max(sigma_b_squared);
isfinite_maxval = isfinite(maxval);
if isfinite_maxval
idx = mean(find(sigma_b_squared == maxval));
pos_threshold = (idx - 1) / (num_bins - 1);
else
pos_threshold = 0.0;
end
pos_threshold = pos_threshold*(num_bins-1);
%%
pos_index = 1;
for i=1:row
for j=1:col
if new_img(i,j) > pos_threshold
new_img(i,j) = 255;
else
new_img(i,j) = 0;
Img_posX(pos_index) = i;
Img_posY(pos_index) = j;
pos_index = pos_index + 1;
end
end
end
figure ; imshow(new_img);
然后检测图片中的直线的条数
%%
%进行直线的分割
%利用扫描线算法确定直线的条数
%主要思路:找到一个点,然后直接在周围寻找点
%该点的四邻域内的点如果都是黑色的就把该点放进去
Point.x = -1;
Point.y = -1;
first_line(1) = Point;
iterator = 0;
max_Target_line = 0;
line_Cell = cell(3,1);
for i=2:row-1
curRow = i;%表明现在做的任何处理都是针对当前行的处理
num_line = 0;%一行扫描下来得到的目标线的个数
isChanged = 0;%表示没有改变
temp_flag = -1;
for j=2:col-1
num = new_img(i,j);
if num == 255 && (num == new_img(i,j-1)...
&& num == new_img(i,j+1)...
&& num == new_img(i-1,j)...
&& num == new_img(i+1,j))
if isChanged == 1
temp_flag = temp_flag * -1;
isChanged = 0;
num_line = num_line + 1;
%发现了一条直线,然后记录下直线的位置,作为该直线的大体位置
end
end
%当前的点为目标点,且直线的四邻域的值也都为目标点
if num == 0 && (num == new_img(i,j-1)...
&& num == new_img(i,j+1)...
&& num == new_img(i-1,j)...
&& num == new_img(i+1,j))
if isChanged == 0
isChanged = 1;
end
iterator = iterator + 1;
Point.x = i;
Point.y = j;
first_line(iterator) = Point;
end
end
if num_line > max_Target_line
max_Target_line = num_line;
end
end
max_Target_line
剩下的就是最下二乘法的拟合程序:
%%
%对直线点集进行最小二乘法拟合,求出直线的斜率
sum_x = 0;
sum_y = 0;
sum_mul = 0;
sum_squar = 0;
first_line = line_Cell{1};
N = length(first_line);
for i=1:N
sum_x = sum_x + first_line(i).x;
sum_y = sum_y + first_line(i).y;
sum_mul = sum_mul + first_line(i).x*first_line(i).y;
sum_squar = sum_squar + (first_line(i).x)^2;
end
mean_x = sum_x*1.0/n;
mean_y = sum_y*1.0/n;
sum_Xdelta = 0;
sum_Ydelta = 0;
for i=1:N
sum_Xdelta = sum_Xdelta + (first_line(i).x-mean_x)^2;
sum_Ydelta = sum_Ydelta + (first_line(i).y-mean_y)^2;
end
delta_x = (sum_Xdelta*1.0/n)^0.5;
delta_y = (sum_Ydelta*1.0/n)^0.5;
temp_sum = 0;
for i=1:N
temp_sum = temp_sum + (first_line(i).x-mean_x)*(first_line(i).y-mean_y)/(delta_x*delta_y);
end
disp('直线的相关系数');
relative_line = temp_sum/n
disp('直线的斜率');
betha = (n*sum_mul-sum_x*sum_y)*1.0/(n*sum_squar-sum_x^2)
如果要检测图片中的真正直线的个数,可以采用huogh直线检测的算法来检测
%%
%Hough变换检测直线,使用(a,p)参数空间,a∈[0,180],p∈[0,2d]
a=180; %角度的值为0到180度
d=round(sqrt(m^2+n^2)); %图像对角线长度为p的最大值
s=zeros(a,2*d); %存储每个(a,p)个数
z=cell(a,2*d); %用元胞存储每个被检测的点的坐标
for i=1:m
for j=1:n %遍历图像每个点
if(q(i,j)==1) %只检测图像边缘的白点,其余点不检测
for k=1:a
p = round(i*cos(pi*k/180)+j*sin(pi*k/180)); %对每个点从1到180度遍历一遍,取得经过该点的所有直线的p值(取整)
if(p > 0)%若p大于0,则将点存储在(d,2d)空间
s(k,d+p)=s(k,d+p)+1; %(a,p)相应的累加器单元加一
z{k,d+p}=[z{k,d+p},[i,j]'];%存储点坐标
else%相当于a为0到-180
ap=abs(p)+1;%若p小于0,则将点存储在(0,d)空间
s(k,ap)=s(k,ap)+1;%(a,p)相应的累加器单元加一
z{k,ap}=[z{k,ap},[i,j]'];%存储点坐标
end
end
end
end
end
angle_num=1;
for i=1:a
for j=1:d*2 %检查每个累加器单元中存储数量
if(s(i,j) >55) %将提取直线的阈值设为70
angle(angle_num)=i;
angle_num=angle_num+1;
lp=z{i,j};%提取对应点坐标
for k=1:s(i,j)%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作
o(lp(1,k),lp(2,k),1)=255; %每个点R分量=255,G分量=0,B分量=0
o(lp(1,k),lp(2,k),2)=0;
o(lp(1,k),lp(2,k),3)=0; %结果为在原图上对满足阈值要求的直线上的点赋红色
end
end
end
end
figure,imshow(o);title('hough变换提取直线');
分享到:
相关推荐
本文介绍了一种新的二维最小误差阈值分割方法——二维直线型最小误差阈值分割法。这种方法的主要特点包括: - **二维灰度直方图的利用**:通过对二维灰度直方图的分析,该方法能够更全面地评估图像的灰度分布特征,...
在图像分析领域,阈值分割、投影检测、差影检测和模板匹配是四个核心概念,它们在处理图像数据、提取特征、识别目标等方面扮演着重要角色。以下将详细阐述这些技术及其应用。 **阈值分割**是图像处理中的基本操作,...
- **基本原理**:该方法的核心在于利用二维混合正态分布假设来建模图像中的目标和背景区域,并寻找一条最优的直线型阈值,使得由该阈值分割得到的目标和背景区域之间的错误概率最小。 - **快速递推算法**:为了提高...
该主题的中心是利用基于局部自适应阈值分割和Hough变换的算法实现答题卡的自动识别。下面将详细介绍这两个关键技术及其在Matlab中的应用。 **局部自适应阈值分割** 局部自适应阈值分割是一种改进的二值化方法,它...
在图像处理领域,边缘检测和图像分割是两个关键步骤,它们在计算机视觉、机器学习以及自动化系统中扮演着重要角色。本压缩包“matlab边缘检测和图像分割5 直线提取算法实现图像直线边缘提取.zip”聚焦于利用MATLAB...
- **阈值分割**:通过设定阈值将图像分为前景和背景。 - **区域生长**:从种子像素出发,将与其相似的相邻像素添加到同一个区域中。 - **分裂合并**:首先将图像细分为小区域,然后根据某些准则合并这些区域。 #...
- **阈值分割**:这是最简单的图像分割方法,通过设定一个特定的灰度阈值,将图像分为前景和背景两部分。例如,可以将所有像素值大于阈值的像素标记为前景,小于或等于阈值的像素标记为背景。 - **区域生长**:该...
Hough变换直线检测广泛应用于工业自动化、交通监控、文档分析等领域,例如识别图像中的边缘、斑马线、文本行等。 总结,Hough变换是一种强大的图像处理工具,它通过将图像中的特征转换到参数空间来检测直线,并能...
综合以上,这个压缩包提供了丰富的图像处理工具,可以用于各种应用场景,例如自动驾驶中的障碍物检测、医学影像分析中的病灶识别、工业质检中的缺陷检测等。熟练掌握这些算法对于理解图像处理和计算机视觉的基本原理...
在这个主题中,“ex06imageSegmentation”可能是一个练习或教程,专注于图像处理技术,包括边缘检测、二值化、霍夫变换直线检测以及阈值分割。 1. **边缘检测**:这是图像处理中的基本步骤,用于识别图像中的边界,...
- **灰度阈值分割法**:这是一种常见的图像分割技术,通过设定一个或多个阈值来将图像中的像素点划分为不同的区域。这种分割方法简单直观,适用于灰度差异较大的场景。 2. **基于区域的分割方法**: - 区域生长...
综上所述,基于Otsu准则和直线截距直方图的阈值分割新算法,不仅在分割性能上超越了传统的二维Otsu法,而且在抗噪能力和计算效率方面也展现出明显优势。随着计算机视觉技术的不断发展,此类高效、稳健的图像分割算法...
在计算机视觉领域,OpenCV(开源计算机视觉库)是...通过理解这个方法的工作原理,并适当地调整参数,我们可以准确地在各种图像中提取出直线特征,这对于许多计算机视觉任务,如车辆检测、道路分割等,都是非常有用的。
2. 图像预处理:二值化,可以使用阈值分割或其他边缘检测算法,如Canny或Sobel。 3. 应用Hough变换:对每个边缘像素,计算所有可能的直线并累加到参数空间的对应位置。 4. 峰值检测:寻找参数空间中的局部最大值,...
- **Hough变换**:利用Hough变换可以有效地检测直线和曲线等形状,特别适用于检测图像中的直线边界。 #### 结语 图像分割是数字图像处理领域中的核心任务之一,其技术和方法不断发展和完善。随着计算机视觉技术的...
在实际应用中,图像分割可以采用多种算法,如阈值分割、区域生长、水平集、图割、基于深度学习的方法等。这些方法各有优缺点,适用于不同的场景。 综上所述,这个项目利用C#编程语言实现了多种边缘检测算子和Hough...
图像分割方法多样,包括基于相似性分割(如阈值分割、区域生长)和非连续性分割(如边缘检测、纹理分析)。此外,还有结构分割法(如边缘检测、纹理分析)和非结构分割法(如统计模式识别、神经网络)。近年来,随着...
图像分割方法多样,包括阈值分割、区域生长、边缘检测和纹理分析等结构分割法,以及统计模式识别、神经网络等非结构分割法。这些技术不断发展,小波变换等现代数学工具也被引入到图像分割中。 边缘检测是图像分割的...
阈值处理是最简单的分割方法之一,它通过设定一个或多个阈值来区分图像中的前景和背景。当像素值超过预设阈值时,它们被视为前景;反之,则被视为背景。这种方法适用于目标与背景对比度明显的图像。在"ex3"文件中,...
图像分割是计算机视觉和图像处理领域中的一个重要话题,它的应用场景非常广泛,例如目标检测、图像识别、物体跟踪等。 在本实验中,我们使用OpenCV库对图像进行分割,实现了图像的分割和特征提取。实验环境为Visual...