自行拍摄鸡蛋破损照片,简述拍摄照片时应注意的事项(包括相机角度,背景设置,光线环境,拍摄距离等);简述图片预处理和瑕疵检测时的考虑与方案设计。

1.拍照注意事项
①相机角度尽量在鸡蛋的正上方约15cm处;
②调整镜头,使鸡蛋位于拍摄图像中心;
③背景颜色为黑色;
④背景需展平且干净,不可有褶皱或其他干扰色点;
⑤不宜在灯光正下方拍摄,易存在阴影;
⑥在光源照射下,不要使背景过亮或过暗,拍摄时易反光或无区分度;
2. 算法大致步骤
①图像亮度调整、去噪、锐化
首先,将原RGB图像转为灰度图像。
为提高图像对比度,采用分段线性变换的方法,但在此次实验中,提高图像对比度后效果较差或作用不大,故不采取。
由于在对图像求边界时,易遭受鸡蛋外壳表面纹状和背景脉冲噪声的影响,同时为保证图像细节,采用中值滤波的方法,对灰度图像进行去噪,然后利用拉普拉斯滤波进行线性锐化,以中和中值滤波使细节淡化的部分。


②高频强调、求边界、去除蛋壳边界
在对图像求边界的同时进行高频强调,以增强图像中变化率较大的区分度,即边界或轮廓部分。
由于在对连通区域进行标记时,常受到鸡蛋外壳的干扰,即使标记时取第二大连通域。出于对检测本身的考虑,鸡蛋壳以外的部分无需考虑在其中,故在去除鸡蛋壳的同时,将蛋壳以外的像素全部置零。具体方法是,将去噪、锐化后的原图像转化为二值图像,先执行腐蚀操作,使其缩减一圈,然后与求边界后的图像相点乘。

③形态学处理
由于求边界后的二值图像轮廓边缘较细,易将原本连通的区域边缘部分分开,从而造成检测中的误差问题。为此,采用形态学操作中的膨胀、闭运算、腐蚀操作使边缘轮廓部分稍微加粗。


④ Blob法求连通域、按面积标注破损位置
采用八连接标注连通域,并计算连通域的个数,每个连通域的面积、中心点以及外接矩形。然后对面积进行排序,找到最大的破损标注位置。如果连通域大于3个,则只标出3个最大的连通域;若连通域小于三个,则全部用其外接矩形标出。

⑤计算检测精度
首先利用Ostu(最大类间方差法)求使图像二值化的最佳全局阈值,利用此阈值将原灰度图像转为二值图像,得到前景分割的结果M;然后分别设定检测阈值和标注阈值。通过手动标注得到标注的模板G,再由④中的检测结果A计算检测破损率和实际破损率。
在计算bad和badg之前,为保证检测区域是否为真实破损区域,先将标注的检测结果与手动标注的模板进行点乘操作,运算后,留下的轮廓才是真正的破损区域。



计算准确率时,需要设置检测阈值th和标注阈值thg,且按以下标准计算TP(被预测为好蛋的坏蛋)、FP(被预测为好蛋的好蛋)、FN、TN;
最后通过公式求得准确率。

经计算,得出准确率为1。

代码文件

放在一个文件夹即可运行。
1.主函数main.m

%% 1.读取图像并转为灰度值
clc;clear;close all;
input_path = './data/dataset/';  %原图路径
output_path = './data/result/';  %检测结果保存路径
labelmoban_path = './data/label_moban/';  %标注模板路径
outlabel_path = './data/result_label/';%检测结果带标签路径
%% 将标注好的图像二值化为标注模板
label_path = './data/label/';    %原图标签路径
biaozhumoban(label_path,labelmoban_path);
%% 生成检测结果+计算检测精度
egg_pre(input_path,output_path);  %预测图像输出在/result/
[Accuracy,bad] = detect_precision(input_path,output_path,labelmoban_path);
disp('准确率:');disp(Accuracy);

2.函数文件biaozhumoban.m

function [] = biaozhumoban(label_path,labelmoban_path)
files_label = dir([label_path '*.jpg']);
l = length(files_label);
for i = 1:lI_label = imread([label_path files_label(i).name]);Sign_I = imbinarize(im2gray(I_label),0.95);imwrite(Sign_I,[labelmoban_path files_label(i).name(1:end-9) 'label_moban.jpg']);
end

3.函数文件egg_pre.m

function [] = egg_pre(input_path,output_path)
files = dir([input_path '*.jpg']);
leng = length(files);
for k = 1:lengI = rgb2gray(imread([input_path files(k).name]));%figure,imshow(I);title('原图')%中值滤波去除脉冲噪声,保持图像细节mid_I = medfilt2(I,[5,5]);  %5*5的中值滤波窗口% figure,imshow(mid_I);title('平滑滤波')% 4.锐化滤波%拉普拉斯滤波线性锐化mask = [1,1,1;1,-8,1;1,1,1];L_I = mid_I-imfilter(mid_I,mask,'replicate');% figure,imshow(L_I);title('拉普拉斯滤波')%非线性锐化:锐化因邻域平均导致的模糊图像:sobel% 5.高频强调+求边界ed = edge(L_I,'canny',0.18);% ed = edge(L_I,'sobel',0.04);% figure,imshow(ed);title('高频强调+边界')%去除蛋壳边界I2 = imbinarize(L_I);% 转为二值图像ed1 = bwmorph(I2,'erode',1);    %腐蚀ed = ed .* ed1;% figure,imshow(ed)% 6.形态学处理expe = bwmorph(ed,'dilate',2);  %figure,imshow(expe);title('膨胀');%闭运算:先膨胀后腐蚀BW = bwmorph(expe,'close',1);%figure,imshow(BW);title('闭运算')corr = bwmorph(BW,'erode',1);% figure,imshow(corr);title('腐蚀');BW = corr;figure,imshow(BW);title('最终结果');% 7.Blob法%1.求连通域,标注破损位置[L,num] = bwlabel(BW,8);%L   : 标记矩阵%num : 连接分量的总数%BW  : 输入的二值图像%8   : 指定期望连接方式(4,8)%2.计算连通域个数,每个连通域面积、中心点、外接矩形stats = regionprops(L,'basic');%stats[Area,Centriod,BoungingBox]%连通域面积、中心点、外接矩形%3.按照连通域面积大小进行排序N = size(stats,1);for i=1:N-1for j=1:N-iif stats(j).Area < stats(j+1).Areatmp = stats(j);stats(j) = stats(j+1);stats(j+1) = tmp;endendend%4.对符合要求的连通域画标记if num >= 3        %如果连通区域大于等于3个,只取前三个最大值for i=1:3boundingbox1 = stats(i).BoundingBox; x = boundingbox1(1);y = boundingbox1(2);width_x = boundingbox1(3);width_y = boundingbox1(4);pos = [x y width_x width_y];rectangle('Position',pos,'EdgeColor','r');endelse            %如果连通区域小于3个,全取for j = 1:numboundingbox1 = stats(j).BoundingBox;  x = boundingbox1(1);y = boundingbox1(2);width_x = boundingbox1(3);width_y = boundingbox1(4);pos = [x y width_x width_y];rectangle('Position',pos,'EdgeColor','r');endendimwrite(BW,[output_path files(k).name(1:end-4) '_pre.jpg']);  %保存
end
end

4.函数文件detect_precision.m

function [accuracy,bad] = detect_precision(input_path,output_path,labelmoban_path)
files = dir([input_path '*.jpg']);
leng = length(files);
% 9.计算检测精度
th = 2;    %检测阈值
thg = 5;    %标注阈值
%检测准确率
bad = zeros(leng,2);
FN=0;TP=0;TN=0;FP=0;
for j = 1:leng%a)求鸡蛋mask,大津法阈值+二值化gray_I = rgb2gray(imread([input_path files(j).name]));level = graythresh(gray_I);  %全局阈值M = imbinarize(gray_I,level);  %前景分割结果%figure,imshow(M),title('前景分割结果');M = uint8(M);I_pre = imread([output_path strcat(files(j).name(1:end-4),'_pre.jpg')]);%I_pre为检测效果groundtruth = imread([labelmoban_path strcat(files(j).name(1:end-4),'_label_moban.jpg')]);%groundtruth:标签模板%将检测结果与实际标注模板相与后,存在部分即为检测真实部分I_pre = I_pre .* groundtruth;%figure,imshow(I_pre);title('检测结果.*标注模板')%1.定义基本变量bad(j,1) = sum(sum(M.*I_pre))./sum(sum(M));  %检测破损率bad(j,2) = sum(sum(M.*groundtruth) ./ sum(sum(M))); %实际破损率if bad(j,2)<thg && bad(j,1)>thFN = FN+1;endif bad(j,2)<thg && bad(j,1)<thTP = TP+1;endif bad(j,2)>thg && bad(j,1)>thTN = TN+1;endif bad(j,2)>thg && bad(j,1)<thFP = FP+1;end
end
accuracy = (TP+TN)/(TP+TN+FP+FN);

机器视觉1:图像预处理与瑕疵检测相关推荐

  1. 机器视觉之图像预处理

    最近在做一个关于稻谷的检测计数的小软件,在制作的过程中对于图像的预处理环节看了许许多多的博客,看了许许多多的内容,于是,想把关于图像的预处理这一环节根据自己的实际需求进行一些介绍,其中也包括自己对于一 ...

  2. 机器视觉:图像与视频朝向检测

    在图片社交.短视频等行业,用户在导入图片.视频的时候,偶尔会导入一些横屏拍摄的视频,使得图片.视频在呈现给用户观看的时候,是旋转了90度或者270度的图片.视频(180度一般极其少见),从而给用户造成 ...

  3. 【图像检测-缺陷检测】基于形态学实现瓶盖瑕疵检测matlab代码

    1 简介 ​随着食品安全问题的频繁发生,消费者对食品包装的质量要求也越来越高,因此塑料防盗瓶盖在出厂时,通常需要通过严格的质量检测,如印刷图案是否清晰正确.有无污渍.圆度是否变形.缺料.溢料.有无防盗 ...

  4. PCB电路板瑕疵检测图像数据集(600多张,含标签)

    下载地址: PCB电路板瑕疵检测图像数据集(600多张,含标签)

  5. opencv表面缺陷检测_机器视觉表面缺陷检测 光学元件瑕疵检测

    在工业领域中,划痕缺陷检测技术主要应用于汽车.3C.冶金等行业,主要是对物体表面划痕进行识别检测.目前大多数生产企业仍在依靠人工检测.受检测要求高,工人长时间工作容易视觉疲劳等因素影响,检测准确率普遍 ...

  6. 机器视觉核心算法——图像预处理

    图像预处理 图像增强(Image enhancement)是数字图像处理技术中最基本的内容之一,也是预处理方法之一. 预处理过程一般包括:数字化.几何变换.归一化.平滑.复原.增强等 图像增强分为基于 ...

  7. 一阶微分算子锐化图像_【动手学计算机视觉】第三讲:图像预处理之图像分割...

    本讲完整代码>> 前言 图像分割是一种把图像分成若干个独立子区域的技术和过程.在图像的研究和应用中,很多时候我们关注的仅是图像中的目标或前景(其他部分称为背景),它们对应图像中特定的.具有 ...

  8. 图像预处理——matlab

    参考此书:数字图像处理与机器视觉,第二版,张铮 ------------------------------------- %图像预处理 RGBIm = imread('lena.jpg');%读入图 ...

  9. 【瑕疵检测】基于matlab GUI Gabor滤波布匹瑕疵检测【含Matlab源码 407期】

    ⛄一.Gabor滤波布匹瑕疵检测简介 1 Gabor滤波器 2 Gabor函数结合代码分析: ⛄二.部分源代码 function varargout = bupi(varargin) % BUPI M ...

  10. 滴普技术荟:某工业产品内部结构尺寸图像测量和缺陷检测分析

    作者:杨超 滴普科技2048实验室AI产品部 算法工程师 需求背景 目前,某工业产品是立体实心结构,内部质量抽检依靠扫描设备,从三个面对内部进行扫描成像后人工判读,但判读自动化程度比较低,测量尺寸需要 ...

最新文章

  1. c# ArrayList
  2. 用python读取、处理、另存为csv文件
  3. python3数据类型:Dictionary(字典)
  4. ElasticSearch入门 :Windows下安装ElasticSearch
  5. quinlan的C4.5编译
  6. php cli 判断,php cli 命令行详解【转】
  7. JSON合并补丁程序:JSON-P 1.1概述系列
  8. html中内联元素和块级元素的区别(整理版)
  9. 【Windows】Windows10基于VMware安装CentOS7的全面教程
  10. Java(38)_BorderLayout布局
  11. python中的匿名函数_Python匿名函数详解
  12. RSA签名和验签Util
  13. 再添荣誉!青软集团获评「山东省科技小巨人企业」称号
  14. gcs服务 oracle,gcs resource
  15. Java-项目1-家庭收支记账软件
  16. 从零搭建移动H5开发项目实战
  17. Adobe Acrobat XI 一进去就闪退;解决Acrobat的闪退问题
  18. 我的编程之路之初出茅庐(二)
  19. 微信小微商户直连接口详解
  20. 《数据库系统概念》第六版官方英文答案

热门文章

  1. 域名证书是什么样子的_什么是网站域名证书
  2. Unity3D说明文档翻译-Audio Manager
  3. w ndows7错误恢复,Win7 0xc000000e启动错误恢复方法
  4. 温敏壳聚糖水凝胶细胞因子复合支架/季铵盐壳聚糖水凝胶三维支架复合GNDF载间充质干细胞的制备
  5. python调用金山词霸的api
  6. 18年12月计算机英语统考成绩查询,没查的抓紧,18年12月四六级成绩查询入口将关闭...
  7. 2009年中国直销业9大主旋律
  8. verilog 四舍五入_IEEE 754 round-to-nearest-even Verilog代码
  9. 实践数据湖iceberg 第十一课 测试分区表完整流程(造数、建表、合并、删快照)
  10. 谷歌搜索表单参数url参数详解