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

前言

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

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

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

学习交流请发邮件 1280253714@qq.com

文件夹在这里

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

功能简介

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

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

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

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

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

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σ问题

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');          %&#x4FDD;&#x5B58;sugar_size&#x77E9;&#x9635;</max>

4.调用摄像头进行处理

(因为摄像头读取的是figure的内容,不是真实图片的大小,所以很难处理,有大神知道怎么处理麻烦私信一下)

左下图中的599指的是白色像素点的数量

右下图是摄像实时预览

计算机视觉与机器学习之6σ问题
mean_size = mean(sugar_size);           %&#x8BA1;&#x7B97;sugar&#x5927;&#x5C0F;&#x7684;&#x5E73;&#x5747;&#x503C;
N = length(sugar_size);                 %sugarsize&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
sigma_2 = 0;                            %&#x3C3;^2
%%&#x6C42;&#x65B9;&#x5DEE;&#x53CA;&#x6807;&#x51C6;&#x5DEE;
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');%&#x521B;&#x5EFA;ID&#x4E3A;1&#x7684;&#x6444;&#x50CF;&#x5934;&#x7684;&#x89C6;&#x9891;&#x5BF9;&#x8C61;&#xFF0C;&#x89C6;&#x9891;&#x683C;&#x5F0F;&#x662F; YUY2_640x480&#xFF0C;&#x8FD9;&#x8868;&#x793A;&#x89C6;&#x9891;&#x7684;&#x5206;&#x8FA8;&#x7387;&#x4E3A;640x480&#x3002;
preview(vid);                    %&#x56FE;&#x50CF;&#x9884;&#x89C8;&#x548C;&#x663E;&#x793A;
start(vid);
pause(3);                        %&#x5EF6;&#x65F6;3&#x79D2;
hold on;
for j=1:20
    a=getsnapshot(vid);          %&#x6355;&#x83B7;&#x56FE;&#x50CF;
    flushdata(vid);              %&#x6E05;&#x9664;&#x6570;&#x636E;&#x83B7;&#x53D6;&#x5F15;&#x64CE;&#x7684;&#x6240;&#x6709;&#x6570;&#x636E;
    b=ycbcr2rgb(a);              %ycrcb&#x683C;&#x5F0F;&#x8F6C;&#x5316;&#x4E3A;rgb&#x683C;&#x5F0F;
    f1=figure;
    imshow(b);                   %&#x663E;&#x793A;&#x56FE;&#x7247;
    A = getframe;                % &#x83B7;&#x53D6;&#x77E9;&#x9635;
    close(f1);
    A.cdata = imresize(A.cdata,[300 300]);
    I = rgb2gray(A.cdata);
    [bw sugardata]= imgProcess(I,i);             %&#x8C03;&#x7528;&#x81EA;&#x5EFA;&#x7684;imgProcess&#x51FD;&#x6570;
    sugar_areas = [sugardata.Area];
    sugar_size(end+1)=sugar_areas(1);            %&#x8BA1;&#x7B97;&#x8054;&#x901A;&#x57DF;&#x7684;&#x9762;&#x79EF;&#x5E76;&#x628A;&#x9762;&#x79EF;&#x50A8;&#x5B58;&#x5728;sugar_size&#x91CC;
    fileName = strcat(num2str(j),'.jpg');
    imwrite(bw,fullfile(imgFile_path,fileName)); %&#x4FDD;&#x5B58;&#x8DEF;&#x5F84;
    figure;
    imshow(bw)
    %%&#x5224;&#x65AD;&#x96F6;&#x4EF6;&#x662F;&#x5426;&#x7B26;&#x5408;&#x6807;&#x51C6;
    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); %&#x5EF6;&#x65F6;
end
close all;
delete(vid);
</max>

参考链接

1.B站CAN博士的视频

【工程数学基础】9_阈值如何选取??在机器视觉中应用正态分布和6-Sigma【这是一期不需要记笔记的轻松视频,简单的知识,重要的运用】_哔哩哔哩_bilibili

2.MATLAB官方文档

校正亮度不均匀问题并分析前景对象- MATLAB & Simulink Example- MathWorks 中国

3.一维高斯分布

一维高斯分布与多维高斯分布 – Junfei_Wang – 博客园

机器学习必须要会的:方差、标准差、相对标准偏差、正态分布的概念_iioSnail的博客-CSDN博客_正态分布的方差和标准差

Original: https://blog.csdn.net/weixin_45817947/article/details/124460896
Author: TianYaKe-天涯客
Title: 计算机视觉与机器学习之6σ问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/641781/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球