计算机视觉与机器学习之6σ问题
时间:2022-08-03 17:19:00
前言
本文章基于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)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)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博客_正态分布的方差和标准差