计算机视觉与机器学习之6σ问题

前言

本文章基于MATLAB的数字图像处理,结合概率论中的正态分布,可应用于工程实践中工件的筛选,拓展功能有基础的机器学习知识。

因为没有工程现场及零件,所以本例的零件用冰糖来替代(哭笑)。

有纰漏请指出,转载请说明。

学习交流请发邮件 [email protected]

文件夹在这里

链接:https://pan.baidu.com/s/1RVRycJtYlVjDdCn73wwYEA 
提取码:ulzd

功能简介

1.读取多张图片并对其进行图像处理,生成数据库。

计算机视觉与机器学习之6σ问题_第1张图片计算机视觉与机器学习之6σ问题_第2张图片

2.定义域值,判断是否符合标准 

计算机视觉与机器学习之6σ问题_第3张图片计算机视觉与机器学习之6σ问题_第4张图片

当样本多到一定程度时,可认为数据服从正态分布

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)

计算机视觉与机器学习之6σ问题_第5张图片计算机视觉与机器学习之6σ问题_第6张图片

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指的是白色像素点的数量

右下图是摄像实时预览

​​​​​​​计算机视觉与机器学习之6σ问题_第7张图片

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博客_正态分布的方差和标准差

你可能感兴趣的:(MATLAB,图像处理)