机器视觉1:图像预处理与瑕疵检测
自行拍摄鸡蛋破损照片,简述拍摄照片时应注意的事项(包括相机角度,背景设置,光线环境,拍摄距离等);简述图片预处理和瑕疵检测时的考虑与方案设计。
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:图像预处理与瑕疵检测相关推荐
- 机器视觉之图像预处理
最近在做一个关于稻谷的检测计数的小软件,在制作的过程中对于图像的预处理环节看了许许多多的博客,看了许许多多的内容,于是,想把关于图像的预处理这一环节根据自己的实际需求进行一些介绍,其中也包括自己对于一 ...
- 机器视觉:图像与视频朝向检测
在图片社交.短视频等行业,用户在导入图片.视频的时候,偶尔会导入一些横屏拍摄的视频,使得图片.视频在呈现给用户观看的时候,是旋转了90度或者270度的图片.视频(180度一般极其少见),从而给用户造成 ...
- 【图像检测-缺陷检测】基于形态学实现瓶盖瑕疵检测matlab代码
1 简介 随着食品安全问题的频繁发生,消费者对食品包装的质量要求也越来越高,因此塑料防盗瓶盖在出厂时,通常需要通过严格的质量检测,如印刷图案是否清晰正确.有无污渍.圆度是否变形.缺料.溢料.有无防盗 ...
- PCB电路板瑕疵检测图像数据集(600多张,含标签)
下载地址: PCB电路板瑕疵检测图像数据集(600多张,含标签)
- opencv表面缺陷检测_机器视觉表面缺陷检测 光学元件瑕疵检测
在工业领域中,划痕缺陷检测技术主要应用于汽车.3C.冶金等行业,主要是对物体表面划痕进行识别检测.目前大多数生产企业仍在依靠人工检测.受检测要求高,工人长时间工作容易视觉疲劳等因素影响,检测准确率普遍 ...
- 机器视觉核心算法——图像预处理
图像预处理 图像增强(Image enhancement)是数字图像处理技术中最基本的内容之一,也是预处理方法之一. 预处理过程一般包括:数字化.几何变换.归一化.平滑.复原.增强等 图像增强分为基于 ...
- 一阶微分算子锐化图像_【动手学计算机视觉】第三讲:图像预处理之图像分割...
本讲完整代码>> 前言 图像分割是一种把图像分成若干个独立子区域的技术和过程.在图像的研究和应用中,很多时候我们关注的仅是图像中的目标或前景(其他部分称为背景),它们对应图像中特定的.具有 ...
- 图像预处理——matlab
参考此书:数字图像处理与机器视觉,第二版,张铮 ------------------------------------- %图像预处理 RGBIm = imread('lena.jpg');%读入图 ...
- 【瑕疵检测】基于matlab GUI Gabor滤波布匹瑕疵检测【含Matlab源码 407期】
⛄一.Gabor滤波布匹瑕疵检测简介 1 Gabor滤波器 2 Gabor函数结合代码分析: ⛄二.部分源代码 function varargout = bupi(varargin) % BUPI M ...
- 滴普技术荟:某工业产品内部结构尺寸图像测量和缺陷检测分析
作者:杨超 滴普科技2048实验室AI产品部 算法工程师 需求背景 目前,某工业产品是立体实心结构,内部质量抽检依靠扫描设备,从三个面对内部进行扫描成像后人工判读,但判读自动化程度比较低,测量尺寸需要 ...
最新文章
- c# ArrayList
- 用python读取、处理、另存为csv文件
- python3数据类型:Dictionary(字典)
- ElasticSearch入门 :Windows下安装ElasticSearch
- quinlan的C4.5编译
- php cli 判断,php cli 命令行详解【转】
- JSON合并补丁程序:JSON-P 1.1概述系列
- html中内联元素和块级元素的区别(整理版)
- 【Windows】Windows10基于VMware安装CentOS7的全面教程
- Java(38)_BorderLayout布局
- python中的匿名函数_Python匿名函数详解
- RSA签名和验签Util
- 再添荣誉!青软集团获评「山东省科技小巨人企业」称号
- gcs服务 oracle,gcs resource
- Java-项目1-家庭收支记账软件
- 从零搭建移动H5开发项目实战
- Adobe Acrobat XI 一进去就闪退;解决Acrobat的闪退问题
- 我的编程之路之初出茅庐(二)
- 微信小微商户直连接口详解
- 《数据库系统概念》第六版官方英文答案
热门文章
- 域名证书是什么样子的_什么是网站域名证书
- Unity3D说明文档翻译-Audio Manager
- w ndows7错误恢复,Win7 0xc000000e启动错误恢复方法
- 温敏壳聚糖水凝胶细胞因子复合支架/季铵盐壳聚糖水凝胶三维支架复合GNDF载间充质干细胞的制备
- python调用金山词霸的api
- 18年12月计算机英语统考成绩查询,没查的抓紧,18年12月四六级成绩查询入口将关闭...
- 2009年中国直销业9大主旋律
- verilog 四舍五入_IEEE 754 round-to-nearest-even Verilog代码
- 实践数据湖iceberg 第十一课 测试分区表完整流程(造数、建表、合并、删快照)
- 谷歌搜索表单参数url参数详解