前言
本文章基于MATLAB的数字图像处理,结合概率论中的正态分布,可应用于工程实践中工件的筛选,拓展功能有基础的机器学习知识。
因为没有工程现场及零件,所以本例的零件用冰糖来替代(哭笑)。
有纰漏请指出,转载请说明。
学习交流请发邮件 1280253714@qq.com
文件夹在这里
链接:https://pan.baidu.com/s/1RVRycJtYlVjDdCn73wwYEA
提取码:ulzd
功能简介
1.读取多张图片并对其进行图像处理,生成数据库。
2.定义域值,判断是否符合标准
当样本多到一定程度时,可认为数据服从正态分布
mean_size = mean(sugar_size); %计算sugar大小的平均值
N = length(sugar_size); %sugarsize数组的长度
sigma_2 = 0; %σ^2
for i=1:N
sum = sum+((sugar_size(i)-mean_size)^2);
end
sigma_2=sum/N;
sigma = sigma_2.^(1/2);
max = int32(mean_size+6*sigma)
min = int32(mean_size-6*sigma)
3.机器学习部分,数据库随着图片的读取不断更新,动态调整正态分布的均值和方差
sugar_size(end+1)=sugar_areas(1);
save('size.mat','sugar_size');
代码
1.batchReviseImg.m 批量读取图片
originalFile_path = 'E:\MATLAB\bin\my_MATLAB_Doc\sixSigema\originalImg'; % 原始的图像文件夹路径
reviseFile_path = 'E:\MATLAB\bin\my_MATLAB_Doc\sixSigema\reviseImg'; % 修改的图像文件夹路径
files = dir(fullfile(originalFile_path,'*.jpg')); %dir 列出文件夹内容,把数据放在结构体里
lengthFiles = length(files);
for i = 1:lengthFiles;
path = strcat(originalFile_path,'\',files(i).name); %要修改的文件的绝对路径
%以下代码是对文件的批量操作,可修改
img = imread(path);%文件所在路径
img = imresize(img,[300 300]);
img = rgb2gray(img);
fileName = strcat(num2str(i),'.jpg');
imwrite(img,fullfile(reviseFile_path,fileName))
end
2.imgProcess.m 对图片进行处理包括开运算、二值化、去噪等等
function [bw sugardata] = imgProcess(I,i);
se = strel('disk',80); %平面形态学结构元素,是形态学膨胀和腐蚀运算的重要部分
background = imopen(I,se); %对I进行开运算
I2 = I - background; %除去背景
I3 = imadjust(I2); %直方图均衡化
bw = imbinarize(I3); %二值化
bw = bwareaopen(bw,50); %去除背景噪音
cc = bwconncomp(bw,4); %在二值图像中查找所有连通分量,参数为4
cc.NumObjects; %联通域的数量
sugardata = regionprops(cc,'basic'); %计算图像中每个对象的面积
3.批量对图片进行处理
reviseFile_path = 'E:\MATLAB\bin\my_MATLAB_Doc\sixSigema\reviseImg'; % 修改的图像文件夹路径
files = dir(fullfile(reviseFile_path,'*.jpg')); %dir 列出文件夹内容,把数据放在结构体里
lengthFiles = length(files);
sugar_size = zeros(1,lengthFiles); %定义一个空矩阵,在后面存放每张图片连通域的面积
for i = 1:lengthFiles;
path = strcat(reviseFile_path,'\',files(i).name); %要修改的文件的绝对路径
%以下代码是对文件的批量操作,可修改
I = imread(path); %文件所在路径
[bw sugardata] = imgProcess(I,i); %调用imgProcess函数
sugar_areas = [sugardata.Area];
sugar_size(1,i)=sugar_areas(1); %计算联通域的面积并把面积储存在sugar_size里
fileName = strcat(num2str(i),'.jpg'); %文件名
imwrite(bw,fullfile(reviseFile_path,fileName)) %将图片写到制定文件夹中
end
3.判断图片中的内容是否符合标准
mean_size = mean(sugar_size); %计算sugar大小的平均值
N = length(sugar_size); %sugarsize数组的长度
sigma_2 = 0; %σ^2
%%求方差及标准差
for i=1:N
sum = sum+((sugar_size(i)-mean_size)^2);
end
sigma_2=sum/N;
sigma = sigma_2.^(1/2);
max = int32(mean_size+sigma);
min = int32(mean_size-sigma);
%%对读取的图片进行操作
I = imread('E:\MATLAB\bin\my_MATLAB_Doc\sixSigema\compare\b2d6a1d80ac0b13d2bef13f78ead2c8.jpg'); %文件所在路径
I = imresize(I,[300 300]);
I = rgb2gray(I);
[bw sugardata]= imgProcess(I,i);
sugar_size(end+1)=sugar_areas(1); %计算联通域的面积并把面积储存在sugar_size里,sugar_size矩阵的大小实时更新
imshow(bw)
%%判断零件是否符合标准
if sugar_size(end)<max && sugar_size(end)>min
text(50,50,'True','Color', ...
'g', 'FontSize', 20, ...
'FontWeight','bold', ...
'HorizontalAlignment', 'center');
else
text(50,50,'False','Color', ...
'r', 'FontSize', 20, ...
'FontWeight','bold', ...
'HorizontalAlignment', 'center');
end
%%
save('size.mat','sugar_size'); %保存sugar_size矩阵
4.调用摄像头进行处理
(因为摄像头读取的是figure的内容,不是真实图片的大小,所以很难处理,有大神知道怎么处理麻烦私信一下)
左下图中的599指的是白色像素点的数量
右下图是摄像实时预览
mean_size = mean(sugar_size); %计算sugar大小的平均值
N = length(sugar_size); %sugarsize数组的长度
sigma_2 = 0; %σ^2
%%求方差及标准差
for i=1:N
sum = sum+((sugar_size(i)-mean_size)^2);
end
sigma_2=sum/N;
sigma = sigma_2.^(1/2);
max = int32(mean_size+sigma);
min = int32(mean_size-sigma);
%%
clear vid;
imgFile_path = 'E:\MATLAB\bin\my_MATLAB_Doc\sixSigema\picture';
vid = videoinput('winvideo',1,'YUY2_640x480');%创建ID为1的摄像头的视频对象,视频格式是 YUY2_640x480,这表示视频的分辨率为640x480。
preview(vid); %图像预览和显示
start(vid);
pause(3); %延时3秒
hold on;
for j=1:20
a=getsnapshot(vid); %捕获图像
flushdata(vid); %清除数据获取引擎的所有数据
b=ycbcr2rgb(a); %ycrcb格式转化为rgb格式
f1=figure;
imshow(b); %显示图片
A = getframe; % 获取矩阵
close(f1);
A.cdata = imresize(A.cdata,[300 300]);
I = rgb2gray(A.cdata);
[bw sugardata]= imgProcess(I,i); %调用自建的imgProcess函数
sugar_areas = [sugardata.Area];
sugar_size(end+1)=sugar_areas(1); %计算联通域的面积并把面积储存在sugar_size里
fileName = strcat(num2str(j),'.jpg');
imwrite(bw,fullfile(imgFile_path,fileName)); %保存路径
figure;
imshow(bw)
%%判断零件是否符合标准
if sugar_size(end)<max && sugar_size(end)>min
text(50,50,'True','Color', ...
'g', 'FontSize', 20, ...
'FontWeight','bold', ...
'HorizontalAlignment', 'center');
else
text(50,50,'False','Color', ...
'r', 'FontSize', 20, ...
'FontWeight','bold', ...
'HorizontalAlignment', 'center');
end
pause(2); %延时
end
close all;
delete(vid);
参考链接
1.B站CAN博士的视频
【工程数学基础】9_阈值如何选取??在机器视觉中应用正态分布和6-Sigma【这是一期不需要记笔记的轻松视频,简单的知识,重要的运用】_哔哩哔哩_bilibili
2.MATLAB官方文档
校正亮度不均匀问题并分析前景对象- MATLAB & Simulink Example- MathWorks 中国
3.一维高斯分布
一维高斯分布与多维高斯分布 - Junfei_Wang - 博客园
机器学习必须要会的:方差、标准差、相对标准偏差、正态分布的概念_iioSnail的博客-CSDN博客_正态分布的方差和标准差
版权归原作者 TianYaKe-天涯客 所有, 如有侵权,请联系我们删除。