汽车轮毂识别项目介绍

引言:因为硬盘损坏,之前的很多资料都找不到,现在凭借印象依靠MATLAB复现了一些功能,希望这个项目在数字图像处理上面对大家能够有一些帮助。

附:赵老师的论文知网下载方式
1、面向柔性自动化生产线的汽车轮毂识别系统
2、汽车轮毂在线识别系统的研究
3、基于机器视觉的汽车轮毂识别系统
大家也可以通过我打包的资源直接下载https://download.csdn.net/download/Magician0619/12229673

一、项目介绍

面向柔性自动化生产线的汽车轮毂识别系统利用计算机视觉等技术方法,在生产中对轮毂进行类型识别和缺陷检测,过程自动化、客观、非接触、高精度。根据柔性自动化生产线实际情况,研究了高质量的机器视觉图像采集方法,并搭建出视觉系统。针对不同型号的轮毂特点,研究其目标图像的特征提取方法。根据提取出的目标图像特征,研究其识别分类器设计及优化方法。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、技术平台

VC++、MATLAB、OpenCV
前期做的时候我利用Visual Studio 2019和OpenCV基本完成项目。这里面我只用MATLAB复现了其中的一些功能。

三、部分技术复现

3.1绘制直方图

灰度直方图是数字图像处理中一个最简单,最有用的工具,它是灰度值的函数,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,纵坐标是该灰度出现的频率(像素个数)。任何一幅图像的直方图都包括了可观的信息。例如直方图中的峰值点和低谷点分别表示图像中像素点分布最多和最少的两种灰度值位置。
针对轮毂图像的特殊性,根据图像灰度直方图,综合运用全局阐值和动态闭值法对图像进行分割,取得了很好的效果。下图为模板轮毂图像的灰度直方图及某灰度级区间的局部放大直方图。图中横坐标是像素的灰度级,纵坐标是该灰度级出现的频率,及该灰度级上的像素总数。

%%绘制灰度直方图
figure;
I=imread('test.png');
subplot(1,2,1);imshow(I);
title('原始图像');
imwrite(I,'test.png');
subplot(1,2,2);
imhist(I);
title('灰度图像直方图');

在这里插入图片描述
如下图所示,可以根据灰度值变化的点判断出轮毂的特征。a:表示主峰,也即第一高峰b:表示次峰,也即第二高峰c:表示波谷,也即最低点。将c处所对应的灰度值作为阂值对图像进行分割 ,灰度值小于 c的像素点主要是背景, 而灰度值大于c的像素点是轮毂。
在这里插入图片描述

3.2Hu不变矩

不变矩(Invariant Moments,IMg),是一种高度浓缩的图像特征,具有平移、灰度、尺度、旋转不变性。因此矩和矩函数被广泛用于图像的模式识别、图像分类、目标识别和场景分析中。Hu的7个不变矩是几何矩,但其低阶几何矩与图像的整体特征有关,不包含太多的图像细节信息,而高阶几何矩易受噪声影响。

对于轮毂来说,我们在拍摄时由于轮毂的旋转和平移等运动会导致拍摄的图像不一致,这时候我们借助Hu不变矩确定矩不变量特征。

这里面直接引用了别人现成写好的库图像的七个不变矩 可用于图像的匹配

function inv_m7 = invariable_moment(in_image)
% 功能:计算图像的Hu的七个不变矩
% 输入:in_image-RGB图像
% 输出:inv_m7-七个不变矩
 
% 将输入的RGB图像转换为灰度图像   
image=rgb2gray(in_image);     
%将图像矩阵的数据类型转换成双精度型
image=double(image);      
%%%
%计算灰度图像的零阶几何矩 
m00=sum(sum(image));     
m10=0;
m01=0;
[row,col]=size(image);
for i=1:row
    for j=1:col
        m10=m10+i*image(i,j);
        m01=m01+j*image(i,j);
    end
end
%%%
u10=m10/m00;
u01=m01/m00;
%%%=================计算图像的二阶几何矩、三阶几何矩============
m20 = 0;m02 = 0;m11 = 0;m30 = 0;m12 = 0;m21 = 0;m03 = 0;
for i=1:row
    for j=1:col
        m20=m20+i^2*image(i,j);
        m02=m02+j^2*image(i,j);
        m11=m11+i*j*image(i,j);
        m30=m30+i^3*image(i,j);
        m03=m03+j^3*image(i,j);
        m12=m12+i*j^2*image(i,j);
        m21=m21+i^2*j*image(i,j);
    end
end
%%%=================计算图像的二阶中心矩、三阶中心矩============
y00=m00;
y10=0;
y01=0;
y11=m11-u01*m10;
y20=m20-u10*m10;
y02=m02-u01*m01;
y30=m30-3*u10*m20+2*u10^2*m10;
y12=m12-2*u01*m11-u10*m02+2*u01^2*m10;
y21=m21-2*u10*m11-u01*m20+2*u10^2*m01;
y03=m03-3*u01*m02+2*u01^2*m01;
%%%=================计算图像的归格化中心矩====================
        n20=y20/m00^2;
        n02=y02/m00^2;
        n11=y11/m00^2;
        n30=y30/m00^2.5;
        n03=y03/m00^2.5;
        n12=y12/m00^2.5;
        n21=y21/m00^2.5;
%%%=================计算图像的七个不变矩======================
h1 = n20 + n02;                      
h2 = (n20-n02)^2 + 4*(n11)^2;
h3 = (n30-3*n12)^2 + (3*n21-n03)^2;  
h4 = (n30+n12)^2 + (n21+n03)^2;
h5 = (n30-3*n12)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n21-n03)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);
h6 = (n20-n02)*((n30+n12)^2-(n21+n03)^2)+4*n11*(n30+n12)*(n21+n03);
h7 = (3*n21-n03)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n12-n30)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);
 
inv_m7= [h1 h2 h3 h4 h5 h6 h7];   

这里面假如如果调用OpenCV也同样简单

CvMoments moments;
CvHuMoments hu;
cvMoments(bkImgEdge,&moments,0); 
cvGetHuMoments(&moments, &hu);
cout<<hu.hu1<<"/"<<hu.hu2<<"/"<<hu.hu3<<"/"<<hu.hu4<<"/"<<hu.hu5<<"/"<<hu.hu6<<"/"<<hu.hu7<<"/"<<"/"<<endl;
cvMoments(testImgEdge,&moments,0); 
cvGetHuMoments(&moments, &hu);
cout<<hu.hu1<<"/"<<hu.hu2<<"/"<<hu.hu3<<"/"<<hu.hu4<<"/"<<hu.hu5<<"/"<<hu.hu6<<"/"<<hu.hu7<<"/"<<"/"<<endl;

在这里插入图片描述

3.3轮廓提取

轮毂的轮廓圆边缘特征在本文的特征识别和分类中非常重要 , 其直径、圆心坐标等信息是不同类型轮毂的重要区分特性的提取基础 。

利用Canny算子进行边缘提取主要分4步进行:①去噪声,使用高斯函数进行平滑滤波;②计算梯度值和方向角;③非最大值抑制;④滞后阈值化

在这里面我们直接调用matlab里面的边缘edge函数,算子使用canny算子

edge函数的使用

im = imread('test.png'); %读取原图                
bw = im2bw( im ); % 转二值图像                          
contour = edge(bw ,'canny'); % 边界检测,采用canny算子 
figure  
imshow(contour);  
title('边界')

在这里插入图片描述
经过Robert算子边缘处理后的局部放大图
经过边缘处理的局部放大图
我们先将图像二值化,再利用bwperim函数求取轮毂的像素边缘,紧接着填充内圆,留下来的就是轮毂的外圆了。

im = imread('test.png');   %读取原图
subplot(221);
imshow(im,[]);title('原图');  %显示原图

im=im2bw(im);                       %转二值图像
subplot(222);
imshow(im,[]),title('二值化');   %显示二值图像

im2=imfill(im,'holes');             %填充
im3=bwperim(im2);                   %轮廓提取
subplot(223);
imshow(im2,[]); title('轮廓填充')             %显示
subplot(224);
imshow(im3,[]);title('外圆')   

这里面外圆的求取方法比较简单,是通过填充然后求外部最大轮廓。也可以调节canny算子的上下阈值,或者也可以通过计算连通域的面积再得出外圆。方法有很多种。
在这里插入图片描述

3.4轮毂洞数

轮毂的孔洞个数是其外形的主要特征之一,常见的轮毂洞数有5个,6个,7个,8个甚至10个,12个,有效提取该特征是轮毂识别中非常重要的一个步骤。

黑色区域是感兴趣ROI区域 ,下图用边缘提取算子提取的各个独立黑色区域的边缘轮廓。在洞数搜索时标记的是图中各个黑色区域的面积 。这里提取了轮毂中较大的洞作为特征之一 , 由于轮辐上的小洞并非在所有类型的轮毂上都出现 , 不具有代表性和普遍性,同时切割去除了中心大洞的影响。

src = imread('test.png');  % 载入图片
subplot(221);
imshow(src);
title('原图')
 
%I = rgb2gray(RGB);
I = src;%在这里我们的原图就是灰度化的了,不需要在处理
se = strel('disk',20);
 
I2 = imbothat(I,se);  % 底帽变换,去除不均匀背景
subplot(222);
imshow(I2);
title('底帽变换')
 
 
I3 = imadjust(I2);   % 调节灰度对比度 
% 灰度图像二值化,全局阈值分割最大化类间方差
level = graythresh(I3);
BW = im2bw(I3,level);

subplot(223);
imshow(BW);
title('阈值分割') 


BW(319:575,506:766)= 255;
dst = BW(95:807,265:998);
subplot(224);imshow(dst);
title('图像切割') 
[L,N] = bwlabel(BW);  % N即为目标个数
 
 
 
% 标记轮毂洞
figure,imshow(dst)
hold on
for k = 1:N
 
    [r,c] = find(L == k);
 
    rbar = mean(r);
 
    cbar = mean(c);   plot(cbar,rbar,'marker','o','markeredgecolor','r','markersize',10);
 
end
 
% 对话框显示目标物个数
h = dialog('Name','目标个数','position',[580 300 220 100]);  % 创建一个对话框窗口
uicontrol('Style','text','units','pixels','position',[45 40 120 50],'fontsize',15,'parent',h,'string',strcat('第1张图的轮毂洞数为',num2str(N),'个'));     % 创建文本内容
uicontrol('units','pixels','position',[80 10 50 20],'fontsize',10,'parent',h,'string','确定','callback','delete(gcf)'); % 创建【确定】按钮
 

在这里插入图片描述

3.5中心图

中心图的具体方法:首先,以每幅图像中轮毂的中心为圆心 , 以 r为半径(0=r=轮毂外轮廓圆半径,以像素个数计算)做圆;然后求出所做圆周上所有像素的平均灰度值i;最后以r为横坐标,以相应的为纵坐标作图,得到的曲线即为中心图。
中心图反映了轮毂外形的大体趋势,凡是轮毂结构有变化的地方,中心图的曲线就会发生相应的变化,而且变化较明显。
在这里插入图片描述

3.6分类识别

在分类识别这边我们需要先提取主要特征。

在之前的工作中,我们确定了每类7个特征入选,分别是轮毂洞数h,轮毂外轮廓圆半径r,轮毂区域像素点数num和四个转动惯量m1,m2,m3,m4(不变矩)。

在对各种轮毂的样本数据进行检测后,我们可以得到各自的特征向量,同时考虑到特征分配和特征选择,我们可以利用投票分类器进行类型划分
在这里插入图片描述

在这里插入图片描述

四、总结

在这里插入图片描述

在数字图像处理中同样是求一个东西,有很多种算法,适合的东西也各不一样,各有优劣。同时,解决一个问题,也有不同的思路和方法,可以充分的开动思维去思考,最终一定可以成功的。

虽然我在cv这方面做得很多东西都不够好,但是很感谢赵老师还有沙老师可以提供给我几个小项目得以练手,多从项目出发,掌握知识的速度才更快!

发布了15 篇原创文章 · 获赞 9 · 访问量 6914

猜你喜欢

转载自blog.csdn.net/Magician0619/article/details/104640294