胶囊检测-Matlab

来源:互联网 发布:矩阵低秩分解理论 编辑:程序博客网 时间:2024/04/24 01:21

胶囊生产中的最后一个环节便是对其质量进行检测,取得良好的质量才会使病人的生命健康得到保障。可以通过对二维胶囊图像进行信号处理,然后判断胶囊是否缺损。

源代码及图片下载

胶囊分类

胶囊生产线上一般能得到以下三种图片:
image_1
这里写图片描述
image_2
这里写图片描述
image_3
这里写图片描述

不同类型的图像有不同的特征,可以通过不同的方式处理。

处理结果

iamge_1

这里写图片描述
这里写图片描述

image_2

这里写图片描述
这里写图片描述

image_3

这里写图片描述
这里写图片描述

处理代码

image_1

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-胶囊检测%%-黄绿色胶囊形变检测,结果保存在 d_isOk 中(1表示存在形变)。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear;clc;close all;% - 选择图像,打开并保存为灰度图[fileName, pathName] = uigetfile('*.*', '打开图片');rgbImg = imread([pathName fileName]);if ndims(rgbImg)==3    orgImg = rgb2gray(rgbImg);else    orgImg = rgbImg;end% - 获取单个胶囊图像并显示[sizeX,sizeY]=size(orgImg);sizeY=floor(sizeY/6);orgImgN(:,:,1)=orgImg(:,1:sizeY);orgImgN(:,:,2)=orgImg(:,(sizeY+1):sizeY*2);orgImgN(:,:,3)=orgImg(:,(sizeY*2+1):sizeY*3);orgImgN(:,:,4)=orgImg(:,(sizeY*3+1):sizeY*4);orgImgN(:,:,5)=orgImg(:,(sizeY*4+1):sizeY*5);orgImgN(:,:,6)=orgImg(:,(sizeY*5+1):sizeY*6);% - 二值化bwImg(:,:,1) = im2bw(orgImgN(:,:,1),0.7);bwImg(:,:,2) = im2bw(orgImgN(:,:,2),0.7);bwImg(:,:,3) = im2bw(orgImgN(:,:,3),0.7);bwImg(:,:,4) = im2bw(orgImgN(:,:,4),0.7);bwImg(:,:,5) = im2bw(orgImgN(:,:,5),0.7);bwImg(:,:,6) = im2bw(orgImgN(:,:,6),0.7);% - 选取目标区域bwImg_(:,:,1)=bwImg(floor(sizeX*5/12):floor(sizeX*2/3),floor(sizeY/3):floor(sizeY*2/3),1);bwImg_(:,:,2)=bwImg(floor(sizeX*5/12):floor(sizeX*2/3),floor(sizeY/3):floor(sizeY*2/3),2);bwImg_(:,:,3)=bwImg(floor(sizeX*5/12):floor(sizeX*2/3),floor(sizeY/3):floor(sizeY*2/3),3);bwImg_(:,:,4)=bwImg(floor(sizeX*5/12):floor(sizeX*2/3),floor(sizeY/3):floor(sizeY*2/3),4);bwImg_(:,:,5)=bwImg(floor(sizeX*5/12):floor(sizeX*2/3),floor(sizeY/3):floor(sizeY*2/3),5);bwImg_(:,:,6)=bwImg(floor(sizeX*5/12):floor(sizeX*2/3),floor(sizeY/3):floor(sizeY*2/3),6);%-计算目标区域亮点的个数imgSumN(1) = sum(sum(bwImg_(:,:,1)));imgSumN(2) = sum(sum(bwImg_(:,:,2)));imgSumN(3) = sum(sum(bwImg_(:,:,3)));imgSumN(4) = sum(sum(bwImg_(:,:,4)));imgSumN(5) = sum(sum(bwImg_(:,:,5)));imgSumN(6) = sum(sum(bwImg_(:,:,6)));%-判断是否合格d_isOk=zeros(1,6);for i=1:6    if imgSumN(i)>200        d_isOk(i)=1;    endend%-结果显示figure;subplot(231);imshow(bwImg_(:,:,1));subplot(232);imshow(bwImg_(:,:,2));subplot(233);imshow(bwImg_(:,:,3));subplot(234);imshow(bwImg_(:,:,4));subplot(235);imshow(bwImg_(:,:,5));subplot(236);imshow(bwImg_(:,:,6));figure;subplot(231);imshow(rgbImg(:,1:sizeY,:));title(d_isOk(1));subplot(232);imshow(rgbImg(:,(sizeY+1):sizeY*2,:));title(d_isOk(2));subplot(233);imshow(rgbImg(:,(sizeY*2+1):sizeY*3,:));title(d_isOk(3));subplot(234);imshow(rgbImg(:,(sizeY*3+1):sizeY*4,:));title(d_isOk(4));subplot(235);imshow(rgbImg(:,(sizeY*4+1):sizeY*5,:));title(d_isOk(5));xlabel('1表示形变');subplot(236);imshow(rgbImg(:,(sizeY*5+1):sizeY*6,:));title(d_isOk(6));

image_2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-胶囊检测%--红白色胶囊检测,结果保存在 d_isOk 中(1表示存在破损)。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear;clc;close all;%-选择图像,打开并保存为灰度图[fileName, pathName] = uigetfile('*.*', '打开图片');rgbImg = imread([pathName fileName]);if ndims(rgbImg)==3    orgImg = rgb2gray(rgbImg);else    orgImg = rgbImg;endsharpenImg = edge(orgImg,'log');   %log算子锐化%-获取单个胶囊图像并显示[sizeX,sizeY]=size(sharpenImg);sizeY=floor(sizeY/6);orgImgN(:,:,1)=sharpenImg(:,1:sizeY);orgImgN(:,:,2)=sharpenImg(:,(sizeY+1):sizeY*2);orgImgN(:,:,3)=sharpenImg(:,(sizeY*2+1):sizeY*3);orgImgN(:,:,4)=sharpenImg(:,(sizeY*3+1):sizeY*4);orgImgN(:,:,5)=sharpenImg(:,(sizeY*4+1):sizeY*5);orgImgN(:,:,6)=sharpenImg(:,(sizeY*5+1):sizeY*6);%-显示单个胶囊边缘figure;subplot(231);imshow(orgImgN(:,:,1));subplot(232);imshow(orgImgN(:,:,2));subplot(233);imshow(orgImgN(:,:,3));subplot(234);imshow(orgImgN(:,:,4));subplot(235);imshow(orgImgN(:,:,5));subplot(236);imshow(orgImgN(:,:,6));%-删除小面积,得到胶囊外壳边界tempImg(:,:,1)=bwareaopen(orgImgN(:,:,1),500);tempImg(:,:,2)=bwareaopen(orgImgN(:,:,2),500);tempImg(:,:,3)=bwareaopen(orgImgN(:,:,3),500);tempImg(:,:,4)=bwareaopen(orgImgN(:,:,4),500);tempImg(:,:,5)=bwareaopen(orgImgN(:,:,5),500);tempImg(:,:,6)=bwareaopen(orgImgN(:,:,6),500);%-去除胶囊外壳orgImgN(:,:,1) = orgImgN(:,:,1)-tempImg(:,:,1);orgImgN(:,:,2) = orgImgN(:,:,2)-tempImg(:,:,2);orgImgN(:,:,3) = orgImgN(:,:,3)-tempImg(:,:,3);orgImgN(:,:,4) = orgImgN(:,:,4)-tempImg(:,:,4);orgImgN(:,:,5) = orgImgN(:,:,5)-tempImg(:,:,5);orgImgN(:,:,6) = orgImgN(:,:,6)-tempImg(:,:,6);%-空洞填充orgImgN(:,:,1) = imfill(orgImgN(:,:,1),'holes');orgImgN(:,:,2) = imfill(orgImgN(:,:,2),'holes');orgImgN(:,:,3) = imfill(orgImgN(:,:,3),'holes');orgImgN(:,:,4) = imfill(orgImgN(:,:,4),'holes');orgImgN(:,:,5) = imfill(orgImgN(:,:,5),'holes');orgImgN(:,:,6) = imfill(orgImgN(:,:,6),'holes');%-图像腐蚀d_se = ones(2,1);orgImgN(:,:,1) = imerode(orgImgN(:,:,1),d_se);orgImgN(:,:,2) = imerode(orgImgN(:,:,2),d_se);orgImgN(:,:,3) = imerode(orgImgN(:,:,3),d_se);orgImgN(:,:,4) = imerode(orgImgN(:,:,4),d_se);orgImgN(:,:,5) = imerode(orgImgN(:,:,5),d_se);orgImgN(:,:,6) = imerode(orgImgN(:,:,6),d_se);%-去小区域orgImgN(:,:,1)=bwareaopen(orgImgN(:,:,1),50);orgImgN(:,:,2)=bwareaopen(orgImgN(:,:,2),50);orgImgN(:,:,3)=bwareaopen(orgImgN(:,:,3),50);orgImgN(:,:,4)=bwareaopen(orgImgN(:,:,4),50);orgImgN(:,:,5)=bwareaopen(orgImgN(:,:,5),50);orgImgN(:,:,6)=bwareaopen(orgImgN(:,:,6),50);%-标记连通域[L(:,:,1),d_isOk(1)]=bwlabel(orgImgN(:,:,1));[L(:,:,2),d_isOk(2)]=bwlabel(orgImgN(:,:,2));[L(:,:,3),d_isOk(3)]=bwlabel(orgImgN(:,:,3));[L(:,:,4),d_isOk(4)]=bwlabel(orgImgN(:,:,4));[L(:,:,5),d_isOk(5)]=bwlabel(orgImgN(:,:,5));[L(:,:,6),d_isOk(6)]=bwlabel(orgImgN(:,:,6));%-保存结果for i=1:6    if(d_isOk(i)>2)        d_isOk(i) = 1;    else        d_isOk(i) = 0;    endend%-图像显示figure;subplot(231);imshow(orgImgN(:,:,1));subplot(232);imshow(orgImgN(:,:,2));subplot(233);imshow(orgImgN(:,:,3));subplot(234);imshow(orgImgN(:,:,4));subplot(235);imshow(orgImgN(:,:,5));subplot(236);imshow(orgImgN(:,:,6));figure;subplot(231);imshow(rgbImg(:,1:sizeY,:));title(d_isOk(1));subplot(232);imshow(rgbImg(:,(sizeY+1):sizeY*2,:));title(d_isOk(2));subplot(233);imshow(rgbImg(:,(sizeY*2+1):sizeY*3,:));title(d_isOk(3));subplot(234);imshow(rgbImg(:,(sizeY*3+1):sizeY*4,:));title(d_isOk(4));subplot(235);imshow(rgbImg(:,(sizeY*4+1):sizeY*5,:));title(d_isOk(5));xlabel('1表示破损');subplot(236);imshow(rgbImg(:,(sizeY*5+1):sizeY*6,:));title(d_isOk(6));

image_3

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-胶囊检测%--灰白色胶囊检测,结果保存在 d_isOk 中(1表示存在破损)。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear;clc;close all;%-选择图像,打开并保存为灰度图[fileName, pathName] = uigetfile('*.*', '打开图片');rgbImg = imread([pathName fileName]);if ndims(rgbImg)==3    orgImg = rgb2gray(rgbImg);else    orgImg = rgbImg;end% - 获取单个胶囊图像并显示[sizeX,sizeY]=size(orgImg);sizeY=floor(sizeY/3);orgImgN(:,:,1)=orgImg(:,1:sizeY);orgImgN(:,:,2)=orgImg(:,(sizeY+1):sizeY*2);orgImgN(:,:,3)=orgImg(:,(sizeY*2+1):sizeY*3);% - 边缘检测sharpenImg(:,:,1) = edge(orgImgN(:,:,1),'log'); %log算子锐化sharpenImg(:,:,2) = edge(orgImgN(:,:,2),'log');sharpenImg(:,:,3) = edge(orgImgN(:,:,3),'log');figure;subplot(131);imshow(sharpenImg(:,:,1));subplot(132);imshow(sharpenImg(:,:,2));subplot(133);imshow(sharpenImg(:,:,3));% - 图像二值化bwImg(:,:,1) = im2bw(orgImgN(:,:,1),0.9);bwImg(:,:,2) = im2bw(orgImgN(:,:,2),0.9);bwImg(:,:,3) = im2bw(orgImgN(:,:,3),0.9);bwImg(:,:,4) = ~im2bw(orgImgN(:,:,1),0.3);bwImg(:,:,5) = ~im2bw(orgImgN(:,:,2),0.3);bwImg(:,:,6) = ~im2bw(orgImgN(:,:,3),0.3);% - 图像相加bwImg(:,:,1)=bwImg(:,:,1)+bwImg(:,:,4);bwImg(:,:,2)=bwImg(:,:,2)+bwImg(:,:,5);bwImg(:,:,3)=bwImg(:,:,3)+bwImg(:,:,6);% - 图像膨胀,去除器械轮廓d_se = ones(6,4);bwImg(:,:,1) = imdilate(bwImg(:,:,1),d_se);bwImg(:,:,2) = imdilate(bwImg(:,:,2),d_se);bwImg(:,:,3) = imdilate(bwImg(:,:,3),d_se);% - 图像腐蚀bwImg(:,:,1) = imerode(bwImg(:,:,1),d_se);bwImg(:,:,2) = imerode(bwImg(:,:,2),d_se);bwImg(:,:,3) = imerode(bwImg(:,:,3),d_se);% - 图像取反,并填充空洞bwImg(:,:,1) = imfill(~bwImg(:,:,1),'holes');bwImg(:,:,2) = imfill(~bwImg(:,:,2),'holes');bwImg(:,:,3) = imfill(~bwImg(:,:,3),'holes');% - 图像相乘,获取胶囊边界检测图像tempImg(:,:,1)=bwImg(:,:,1).*sharpenImg(:,:,1);tempImg(:,:,2)=bwImg(:,:,2).*sharpenImg(:,:,2);tempImg(:,:,3)=bwImg(:,:,3).*sharpenImg(:,:,3);% - 图像膨胀d_se=ones(2,2);tempImg(:,:,1) = imdilate(tempImg(:,:,1),d_se);tempImg(:,:,2) = imdilate(tempImg(:,:,2),d_se);tempImg(:,:,3) = imdilate(tempImg(:,:,3),d_se);% - 空洞填充tempImg(:,:,1) = imfill(tempImg(:,:,1),'holes');tempImg(:,:,2) = imfill(tempImg(:,:,2),'holes');tempImg(:,:,3) = imfill(tempImg(:,:,3),'holes');% - 图像腐蚀d_se=ones(4,2);tempImg(:,:,1) = imerode(tempImg(:,:,1),d_se);tempImg(:,:,2) = imerode(tempImg(:,:,2),d_se);tempImg(:,:,3) = imerode(tempImg(:,:,3),d_se);% - 去除小连通域tempImg(:,:,1) = bwareaopen(tempImg(:,:,1),30);tempImg(:,:,1) = bwareaopen(tempImg(:,:,1),30);tempImg(:,:,1) = bwareaopen(tempImg(:,:,1),30);% - 图像膨胀tempImg(:,:,1) = imdilate(tempImg(:,:,1),d_se);tempImg(:,:,2) = imdilate(tempImg(:,:,2),d_se);tempImg(:,:,3) = imdilate(tempImg(:,:,3),d_se);% - 图像腐蚀d_se=ones(2,4);tempImg(:,:,1) = imerode(tempImg(:,:,1),d_se);tempImg(:,:,2) = imerode(tempImg(:,:,2),d_se);tempImg(:,:,3) = imerode(tempImg(:,:,3),d_se);% - 去小连通域tempImg(:,:,1) = bwareaopen(tempImg(:,:,1),30);tempImg(:,:,1) = bwareaopen(tempImg(:,:,1),30);tempImg(:,:,1) = bwareaopen(tempImg(:,:,1),30);% - 图像膨胀tempImg(:,:,1) = imdilate(tempImg(:,:,1),d_se);tempImg(:,:,2) = imdilate(tempImg(:,:,2),d_se);tempImg(:,:,3) = imdilate(tempImg(:,:,3),d_se);% - 显示图像figure;subplot(131);imshow(tempImg(:,:,1));subplot(132);imshow(tempImg(:,:,2));subplot(133);imshow(tempImg(:,:,3));% - 标记连通域[L(:,:,1),d_isOk(1)]=bwlabel(tempImg(:,:,1));[L(:,:,2),d_isOk(2)]=bwlabel(tempImg(:,:,2));[L(:,:,3),d_isOk(3)]=bwlabel(tempImg(:,:,3));% - 保存结果for i=1:3    if(d_isOk(i)>0)        d_isOk(i) = 1;    else        d_isOk(i) = 0;    endendfigure;subplot(131);imshow(rgbImg(:,1:sizeY,:));title(d_isOk(1));subplot(132);imshow(rgbImg(:,(sizeY+1):sizeY*2,:));title(d_isOk(2));xlabel('1表示破损');subplot(133);imshow(rgbImg(:,(sizeY*2+1):sizeY*3,:));title(d_isOk(3));
0 0
原创粉丝点击