基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记
基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测
此内容为付费资源,请付费后查看
6
立即购买
您当前未登录!建议登录后购买,可保存购买订单
付费资源

资源概况

购买将获得:完整无水印论文报告+源码源文件
其他注意:一经购买,概不退款,不提供指导,每年数量有限,售完为止。

资源介绍(截取部分,完整请购买)

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记

一、简介

该项目的任务是胶囊缺陷检测:找到所有胶囊的位置,正确的胶囊标绿色的方框,错误的胶囊标红色,错误的胶囊存在如下缺陷:漏装胶囊、胶囊放置在错误的位置、胶囊泄漏内部药粉、胶囊被挤压变形等。如图1所示分别为漏装胶囊、胶囊放置在错误的位置、胶囊泄漏内部药粉、胶囊被挤压变形对应的实物图。

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记

图1 漏装胶囊、胶囊放置在错误得位置、胶囊泄漏内部药粉、胶囊被挤压变形(从左至右)

主要思路:
1.找到胶囊板的位置,将其进行定位并从背景中提取出来。
2.找到每一个胶囊的位置,对其进行定位并从胶囊板背景中的提取出来。
3.对胶囊进行缺陷检测,将正确的胶囊标绿色方框,错误的胶囊标红色方框。


二、建议的办法

利用常规的开闭运算和连通域识别来获取胶囊板的位置;利用去雾算法增强胶囊与胶囊板背景之间的对比度,在HSV空间提取出胶囊的信息;利用开闭运算、图像重建、连通域识别获取胶囊的位置及其外接矩形的大小;对胶囊位置进行矩阵式重排列,并利用template中的位置信息作为模板对待检测的胶囊位置进行位置校正、对胶囊的外接矩形大小进行校正;利用校正后的胶囊位置和外接矩形将每一个胶囊从原始图像和中间二值图像中截取出来原始胶囊图集ISRC和二值胶囊图集IBW;对二值胶囊图集IBW中的每一个胶囊进行面积检测,通过判断面积占比来检测漏装胶囊、胶囊泄漏内部药粉、胶囊被挤压变形这三种缺陷;对原始胶囊图集ISRC中的每一个胶囊进行RGB检测,通过计算RGB三个通道的直方图相似性获取每一张图片相互比对后的相似性系数矩阵,分析矩阵来检测胶囊放置在错误的位置这种缺陷;最后将正确的胶囊标绿色方框,错误的胶囊标红色方框。

2.1 胶囊板位置获取

观察图像,发现药板和黑色背景对比度较强,可以用简单的开闭运算和连通域识别来获取胶囊板的位置,具体的步骤如下:

读入原始图像—>转变为灰度图片—>利用80*80的模板进行闭开运算去除黑色背景中可能存在的干扰—>二值化—>连通域识别获取胶囊板的中心位置和外接矩形的大小。
具体代码如下:

I=imread(['images of project\set 1\blister_mixed_',num2str(z_p,'%02d'),'.png']);
I_gray=im2gray(I);
se=ones(80,80);
I_close=imclose(I_gray,se);
I_open=imopen(I_close,se);
I_bw=imbinarize(I_open,0.5);
[l,b_n] = bwlabel(I_bw,8);
status_box_b=regionprops(l,'BoundingBox');
centroid_box = regionprops(l,'Centroid');

效果展示:

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记

 

2.2 去雾算法增强对比度

观察图像,发现两种胶囊板的背景略有区别:蓝白色胶囊的背景更为复杂,同时有彩色的反光,导致无法利用RGB阈值将胶囊从背景中提取出来。同时观察发现胶囊板透明的塑料类似于雾,所以采用去雾算法来提高胶囊与背景之间的对比度。再利用HSV阈值来提取胶囊成分,并对胶囊成分进行滤波、图像重建、二值化处理得到待定位的胶囊图片。具体步骤如下:

利用2.1中获取得到的胶囊板的中心位置和外接矩形截取胶囊板的局部图像—>去雾处理—>转换到HSV空间—>设置HSV阈值提取胶囊成分—>变回RGB空间、灰度化—>中值滤波得到I_UnW_Gray—>开运算分离残余的背景和胶囊得到I_UnW_Gray_Open—>以I_UnW_Gray_Open为MAKER,I_UnW_Gray为MASK重构图像—>二值化
具体代码如下:

center_xy=centroid_box(1).Centroid;
BoundingBox=status_box_b(1).BoundingBox(1,3:4)-[20,50];
I_Board_nor=I(uint16(center_xy(1,2)-BoundingBox(1,2)/2):uint16(center_xy(1,2)+BoundingBox(1,2)/2),uint16(center_xy(1,1)-BoundingBox(1,1)/2):uint16(center_xy(1,1)+BoundingBox(1,1)/2),:);
I_Board=dehazing_main(I_Board_nor);
I_Board_hsv=rgb2hsv(I_Board);
I_Board_hsv(:,:,3)=I_Board_hsv(:,:,3)-I_Board_hsv(:,:,3)+0.5;
[m,n,~] = size(I_Board);
I_UnW=double(zeros(m,n,3));
for i=1:m
    for j=1:n
        if((I_Board_hsv(i,j,2)>0.43 && I_Board_hsv(i,j,1)<0.6)==1)
            I_UnW(i,j,1)=I_Board_hsv(i,j,1);
            I_UnW(i,j,2)=I_Board_hsv(i,j,2);
            I_UnW(i,j,3)=I_Board_hsv(i,j,3)+0.4;
        end
    end
end
 
I_UnW_rgb=hsv2rgb(I_UnW);
I_UnW_rgb=uint8(255.*I_UnW_rgb);
I_UnW_Gray=im2gray(I_UnW_rgb);
I_UnW_Gray=medfilt2(I_UnW_Gray,[3,3]);
se=ones(5,5);
I_UnW_Gray_Open=imopen(I_UnW_Gray,se);
I_UnW_Gray=imreconstruct(I_UnW_Gray_Open,I_UnW_Gray);
I_UnW_BW=imbinarize(I_UnW_Gray,0.001);

效果展示:

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记

2.3 胶囊位置获取

观察图像,发现胶囊二值化后的图像上存在很多离散的点,为了获得一个个邻域连通的胶囊,这样才能使用连通域识别函数对每一个胶囊进行定位。所以利用开闭运算、图像重建、连通域识别获取胶囊的位置及其外接矩形的大小。具体步骤如下:

开运算,分离粘连的胶囊—>闭运算填补胶囊的孔洞得到图像I_UnW_Gray_Close—>腐蚀得到图像I_UnW_Gray_Erode—>以I_UnW_Gray_Erode为MAKER,I_UnW_Gray_Close为MASK重构图像I_UnW_Gray_Re—>连通域识别获取每个胶囊的中心位置和外接矩形的大小
具体代码如下:

se=ones(8,8);
I_UnW_Gray_Close=imclose(I_UnW_BW,se);
se=ones(16,16);
I_UnW_Gray_Erode=imerode(I_UnW_Gray_Close,se);
I_UnW_Gray=imreconstruct(I_UnW_Gray_Erode,I_UnW_Gray_Close);
[l,b_n] = bwlabel(I_UnW_Gray,8);
status_box=regionprops(l,'BoundingBox');
centroid_box = regionprops(l,'Centroid');

效果展示:

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记

2.4 胶囊位置校正

观察图像,发现标记出来的胶囊位置错误,为了解决这个问题,使用相同程序通过对template图像标记获取每个胶囊的位置及其外接矩形的大小,并将这两个数据作为模板来校正待检测胶囊的位置及其外接矩形的大小。

为了使模板匹配能够和待检测胶囊位置匹配,需要对胶囊位置进行矩阵式重排列:先找出所有胶囊的中心点坐标行坐标最小的值centriod_min,再以[centriod_min-15, centriod_min+55]为阈值来找出同一行的其他胶囊,并将这组胶囊中心坐标另存为一组按照列坐标由大到小排列的数据表,然后将这组胶囊的原始行列坐标置为[1000,1000]。其余行胶囊的重排列与第一行的方法一样,这样就可以得到矩阵式重排列后的胶囊位置。
然后使用模板的位置信息中行坐标为参考值template,再以[template-40, template+30] 为阈值来判断程序标记出来的待检测胶囊的位置是否在中心位置,不在此区间的胶囊中心坐标替换为模板中对应的中心坐标,同时不在此区间的胶囊外接矩形数据也替换为模板中对应的外接矩形数据。

最后,还有可能出现中心位置符合要求,但是外接矩形大小相差很大的情况,此时使用模板中的外接矩形长宽与待检测胶囊的外接矩形长宽进行对比,同样也需要设置阈值区间来判断待检测胶囊的外接矩形长宽是否符合正常,具体步骤与位置信息比对流程类似,这里不做累述。通过上述步骤就可以将胶囊的位置进行校正。具体步骤如下:

胶囊位置矩阵式重排列—>胶囊中心坐标校正—>胶囊的外接矩形长宽校正—>在原始图片中标记出每个胶囊的位置,绿色框为直接通过连通域识别出来的位置,蓝色框为通过中心位置校正后重新标记出的位置,红色框为通过外接矩形长宽校正后重新标记出来的位置
具体代码如下:

for i=1:b_n
    centriod(i,1:2)=centroid_box(i,1).Centroid(1,:);
    centriod(i,3)=i;
end
 
b_a=0;
for b=1:b_n
    centriod_min=min(centriod(:,2));
    for i=1:b_n
        if centriod_min > centriod(i,2)
            centriod_min=centriod(i,2);
        end
    end
 
    flag=1;
    for i=1:b_n
        if (centriod(i,2) > (centriod_min - 15)) && (centriod(i,2) < (centriod_min + 60))
            centriod_r(flag,:,b)=centriod(i,:);
            centriod(i,1)=1000;
            centriod(i,2)=1000;
            b_a=b_a+1;
            flag=flag+1;
        end
    end
    
    for i=1:flag-1
        for j=1:flag-1-i
            if(centriod_r(j,1,b)>centriod_r(j+1,1,b))
                [centriod_r(j,:,b),centriod_r(j+1,:,b)]=swap(centriod_r(j,:,b),centriod_r(j+1,:,b));
            end
        end
    end
    
    if b_a==b_n
        break;
    end
end
 
template=load('set2template3.mat');
% template=load('template.mat');
template=template.centriod_r;
 
[m,n,p]=size(centriod_r);
centriod_r_r=zeros(size(template));
q=1;
for i=1:p
    flag=0;
    for j=1:m
        if(centriod_r(j,1,i))
            flag=flag+1;
        end
    end
    if flag>=2
        for n=1:m
            centriod_r_r(n,:,q)=centriod_r(n,:,i);
        end
        q=q+1;
    end
end
 
[m,n,p]=size(template);
centriod_re=template;
for i=1:p
    for j=1:m
        centriod_re(j,3,i)=100;
    end
end
for i=1:p
    for j=1:m
        for o=1:m
            if (centriod_r_r(j,1,i) > (template(o,1,i) - 40)) && (centriod_r_r(j,1,i) < (template(o,1,i) + 30))
                centriod_re(o,:,i)=centriod_r_r(j,:,i);
            end 
        end
    end
end
 
[m,n,p]=size(centriod_r_r);
centriod_t=centriod;
for i=1:p
    for j=1:m
        centriod((i-1)*m+j,:)=centriod_re(j,:,i);
        centriod_t((i-1)*m+j,:)=template(j,:,i);
    end
end
 
[b_t,~]=size(centriod);
 
% template_box=load('template_box.mat');
template_box=load('set2template_box');
template_box=template_box.status_box;
figure(4),imshow(I_Board_nor),title('胶囊标记图片');hold on;
for i=1:b_t
    if centriod(i,3)~=100
        if status_box(centriod(i,3)).BoundingBox(1,3)>template_box(centriod(i,3)).BoundingBox(1,3)-25 && status_box(centriod(i,3)).BoundingBox(1,3)<template_box(centriod(i,3)).BoundingBox(1,3)+40 && status_box(centriod(i,3)).BoundingBox(1,4)>template_box(centriod(i,3)).BoundingBox(1,4)-17 && status_box(centriod(i,3)).BoundingBox(1,4)<template_box(centriod(i,3)).BoundingBox(1,4)+40
            rectangle('position',status_box(centriod(i,3)).BoundingBox,'edgecolor','g');
        else
            rectangle('position',template_box(centriod_t(i,3)).BoundingBox,'edgecolor','b');
%             centriod_t(i,3)
        end
    else
        rectangle('position',template_box(centriod_t(i,3)).BoundingBox,'edgecolor','r');
    end
end

效果展示:

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记

2.5 基于二值图像面积占比的胶囊缺陷检测

首先获取每个胶囊的字图片,利用校正后的胶囊位置和外接矩形将每一个胶囊从2.3节中的二值图像I_UnW_Gray_Re中截取出来二值胶囊图集IBW,同时将每个焦囊从原始图片中截取出来得到原始胶囊图集ISRC。一开始希望直接通过对二值图像集中每张图片统计白色点数Nw占整张图片像素点NA的比例来判断胶囊是否完整,但是在图像运算的过程中会出现胶囊信息的丢失,如图6所示。这时会导致白色点数占比达不到阈值,会判定为缺陷。这里引入基于灰度强度差权重来分离背景,由此可以得到背景点数NB,再利用公式Nw/(NA-NB)计算面积占比。当每一个胶囊的面积占比低于0.45时,判定为缺陷胶囊。

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记

具体步骤如下:
利用校正后的胶囊位置和外接矩形从2.3节中的二值图像I_UnW_Gray_Re中截取出来二值胶囊图集IBW,同时将每个焦囊从原始图片中截取出来得到原始胶囊图集ISRC—>统计IBW中每张子图片中白色点数Nw—>计算ISRC中每张图片的灰度强度差权重来分离背景—>统计每张子图片中背景点数NB—>利用公式Nw/(NA-NB)计算面积占比—>如果胶囊的面积占比低于0.45时,判定为缺陷胶囊
(具体代码详见下载)

效果展示:

基于RGB直方图相似性/二值图像面积占比的药片胶囊缺陷检测-创享日记

2.6 基于RGB直方图相似性的胶囊缺陷检测

对2.4节得到的原始胶囊图集ISRC进行RGB直方图相似性判断:该相似性比对仅在每一行胶囊之间进行,每一个胶囊与同行其他胶囊进行RGB直方图相似性计算,这样就可以获得一个相似性矩阵,如表1所示。
(其余完整详细详见下载)

© 版权声明
THE END
喜欢就支持一下吧
点赞3 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容