【瑕疵检测】基于matlab瓶盖瑕疵检测【含Matlab源码 730期】
一、简介
文中将图像预处理与边缘检测相结合对瓶盖瑕疵进行检测, 先使用直方图规定化的方法对图像做出修正与增强, 再利用中值滤波的方法消除图像孤立的噪声点;Canny算子快速分辨出瓶盖瑕疵, 再利用采用Otsu阈值方法求取自适应阈值自动选择并提取瑕疵。
1 图像预处理
在特征值提取之前, 必须对图像进行预处理。在实验中使用的灰度图像。应用直方图规定化和中值滤波器对图像降噪、增强。
1.1 直方图规定化
在之前的许多研究成果中, 将直方图均衡化作为图像增强的主要方法。但是图像一般比较灰暗, 它的灰度直方图全都集中在低灰度区, 低灰度频率很高把这幅图片均衡化后, 相对较低灰度的像素会被均衡到高灰度区, 图像会产生高亮和失真。所以本文放弃直方图规则化而选用直方图规定化就是为了避免出现这种现象。直方图规定化是使原图像灰度直方图变成规定形状的直方图而对图像做修正的增强方法。它是对直方图均衡化处理的一种有效地扩展, 而直方图均衡化处理只是直方图均衡化的一个特例。用直方图规定化对图片增强。断经实验效果。
在对图像进行预处理后, 图像的对比度明显上升, 并且没有高亮和失真, 有利于特征值的提取。
1.2 图像消噪
在图像采集和直方图规定化过程中难免会产出不必要地噪声, 因此须对图像进行消噪处理。本文采用了比较普遍的中值滤波处理方法。
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术, 基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替, 让周围的像素值接近的真实值, 从而消除孤立的噪声点。方法是去某种结构的二维滑动模板, 将板内像素按照像素值的大小进行排序, 生成单调上 (或下降) 的为二维数据序列。二维中值滤波输出为:
2 边缘检测
观察布匹瑕疵图像可以发现, 以布匹纹理为背景的图像多呈现出屋顶状边缘, 与瑕疵的特征相近, 易引起误检、漏检[7]。另外, 由于图像采集环境或光照不均匀等因素的影响, 经常会造成瑕疵图像灰度差异很大, 为了提高瑕疵部分的对比度, 减小光照的影响, 首先将灰度范围拉伸到相同的区域, 然后再进行相应的处理[8]。传统的Canny算子中, 高、低阈值Tn, Te和σ值不是由图像边缘的特征信息决定, 而是需要人为设定[9]。这样对图像容易造成细节的丢失, 具有较差的边缘连续性, 并且一组固定的平滑参数和阈值, 对某一幅图像可能会有很好的效果, 但是如果图像纹理有变化, 就会产生不理想的结果。
文中采用Otsu阈值方法求取自适应阈值。Otsu算法是一种使类间方差最大的自动确定阈值方法。
其基本思想是把图像像素分为背景和目标两类, 通过搜索计算类间方差最大值, 得到最优阈值。
具有瑕疵的布匹图像可以视为简单的双峰值图像, 具体步骤如下:
- 把图像中的像素按灰度值阈值T分为两类Q1和Q2。Q1由0~S的像素组成, Q2由S+1~M组成, M为像素的灰度级数。
- 设Q1和Q2各自的平均灰度值为u1和u2, 图像总的平均灰度值为u;Q1和Q2占图像中的比例为w1和w2。
二、部分源代码
%*********初始化********
clc; clear all; close all;
%*********图像预处理********
I=imread('11.jpg');%读入标准模板图像
J=rgb2gray(I);%转化为灰度图片
subplot(241),imshow(I);title('原图');%显示图片
K=imread('qx1.jpg');
M=rgb2gray(K);
subplot(242),imshow(K);title('缺陷图');
%*********为得到更好的效果,可适当的采用图片增强,直方图均衡化,平滑,锐化等操作********
%********图像配准,以处理有旋转现象的图片********
%***(一)差影法,去噪 最终结果变量 L
L=imabsdiff(J,M);%两张图片相减
subplot(243),imshow(L);title('相减后灰度图L');
%***(二)图像增强两种方法 最终结果变量 L1 L2 使用变量L
L1=imadjust(L,[0.1 1], [0 1]);
subplot(244),imshow(L1);title('灰度变换增强对比度L1');
%subplot(275),imhist(L1);title('直方图灰度变换增强对比度L1');
[L2,T]=histeq(L,64);% 直方图均衡化,图像灰度扩展到0~255,但是只有64个灰度级
%subplot(276),imshow(L2);title('直方图均匀化L2');
%subplot(277),imhist(L2);title('直方图均匀化后的直方图L2');
%subplot(278),plot((0:255)/255,T);title('转移函数曲线L2');
%***(三)图像滤波三种方法 ,中值滤波VS均值滤波VS维纳滤波,选取效果最佳的。最终结果变量 B1 B2 B3
%****中值滤波****
B1=medfilt2(L1,[5 5]); %中值滤波,窗口大小为5×5
%subplot(279),imshow(B1);title('二维中值滤波效果B1');
%***均值滤波***
M4=[0 1 0; 1 0 1; 0 1 0];
M4=M4/4;% 4邻域平均滤波
B2=filter2(M4,L1);
subplot(2,4,5),imshow(B2);title('均值滤波B2');
%*****Wiener****
[B3 noise]=wiener2(L1, [5 5]);%窗口大小为5×5
%subplot(2,7,11),imshow(B3);title('自适应魏纳滤波B3');
%***(四)5种不同的梯度增强法进行图像锐化
%***(五)图像的高通滤波
%********图像分割********
%***(六)图像的阈值分割 中间结果变量 C1 C2 最终结果变量 C11 C12
%subplot(2,7,12),imhist(B1);title('B1滤波后灰度直方图');% 观察灰度直方图,灰度1根据直方图的谷确定阈值,40处有谷,确定阈值T=140
C1=im2bw(B1,0.1/255); %im2bw函数需要将灰度值转换到[0,1]范围内
subplot(2,4,6),imshow(C1);title('0.1 C1阈值分割结果');
C11=double(C1);
%figure,imhist(B1);title('图像的阈值分割直方图');
%figure,imshow(C1);title('图像的阈值结果');
%阈值迭代法分割
ZMax=max(max(B2));
ZMin=min(min(B2));
TK=(ZMax+ZMin)/2;
bCal=1;
iSize=size(I); %图像大小
while(bCal)
iForeground=0;
iBackground=0; %定义前景和背景数
ForegroundSum=0;
BackgroundSum=0; %定义前景和背景的灰度总和
for i=1:iSize(1)
for j=1:iSize(2)
tmp=I(i,j);
if(tmp>=TK)
iForeground=iForeground + 1;
ForegroundSum=ForegroundSum + double(tmp);
else
iBackground=iBackground + 1;
BackgroundSum=BackgroundSum + double(tmp);
end
end
end
ZO = ForegroundSum/iForeground;
ZB = BackgroundSum/iBackground; %计算前景和背景的平均值
TKTmp = uint8((ZO+ZB)/2);
if(TKTmp==TK)
bCal = 0;
else
TK = TKTmp;
end %当前阈值不再变化,说明迭代结束
end
disp(strcat('迭代后的阈值:',num2str(TK)));
C2=im2bw(B2,double(TK)/255);
C12=double(C2);
subplot(2,4,7),imshow(C12);title('阈值迭代法分割结果C12');
%se = strel('line',11,90);
%C111=imdilate(C12,se);
%C121=imerode(C111,se);
%***(七)图像边缘检测 最终结果变量 D1 D2 D3 D4 sobel,canny,prewitt等
%D1=edge(C11,'log',0.003,2); % σ=2
%figure,imshow(D1);title('边缘检测 log σ=2');
%D2=edge(C11,'canny',0.2);
%figure,imshow(D2);title('边缘检测 canny算子');
%D3=edge(C121,'log',0.003,2); % σ=2
%figure,imshow(D3);title('迭代法 边缘检测 log σ=2');
D4=edge(C12,'canny',0.2);
figure,imshow(D4);title('存在缺陷');
imwrite(D4,'F:\毕业设计\毕业程序设计\缺陷图片1.jpg')%存入图片
[row, column] = size(D4);
num = 0;
for i = 1:row
for j = 1:column
if(D4(i,j)==1)
num = num +1;
rec(:,num) = [i;j];
end
end
f=imread('qx3.jpg');%读入图片
%subplot(2,2,1);imshow(f)
f1=im2double(f);%将真彩图片转化为double型
I=rgb2gray(f);%将真彩图像转化为灰度图像
%subplot(2,2,2);imshow(I)
%subplot(2,2,3);imhist(I);%显示直方图
p=edge(I,'sobel');
%subplot(2,2,4);imshow(p);
imwrite(I,'C:\Users\lenovo\Desktop\f9ffefca4217d2bbf043243db84a4b86\瑕疵检测\灰度1.jpg')
h4=medfilt2(p,[1,1]);%用3*3的模板进行中值滤波
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/115523585
- 点赞
- 收藏
- 关注作者
评论(0)