锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-09-22 13:07:02 bw氯气传感器

前言

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章