利用MATLAB对图像中物体进行计数

**

利用MATLAB对一张图片中相同得物体进行计数。

**

MATLAB中已有函数可对二值化中的白色区域进行计数。
[labeled,numObjects]=bwlabel(‘图像名’,8);
运行后numObjects(即物体个数)的值会显示在右侧的工作区中。
因此我们需要做的是对图像进行处理,包括二值化,除噪等。
若直接将图像转化为二值图像进行计数,则无法得到正确数据。

clc;
close all;
clear all;
I=imread('pro2.png');
I1=rgb2gray(I);
subplot(152);imshow(I1);
thresh=graythresh(I1);
I2=im2bw(I1,thresh);
subplot(153);imshow(I2);
[labeled,numObjects]=bwlabel(I2,8);

利用MATLAB对图像中物体进行计数_第1张图片利用MATLAB对图像中物体进行计数_第2张图片
显然计数错误。

这幅图片中药片的摆放无重叠,但不独立,颜色都为浅黄色,因此可以利用取色工具提取RGB颜色分量来使药片分离开来。经过提取后药片的R分量为170-220,G为180-200,B为130-160。因此将这些区间以外的区域置为255,即为白色。(由于药片面积不小,建议置白的区域尽可能大,更容易让药片相互独立)。

clc;
close all;
clear all;
I=imread('pro2.png');
lot=I;
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
R1=R;
G1=G;
B1=B;
R1((R<=180|R>=220)|(G<=180|G>=200)|(B<=140|B>=160))=255;
G1((R<=180|R>=220)|(G<=180|G>=200)|(B<=140|B>=160))=255;
B1((R<=180|R>=220)|(G<=180|G>=200)|(B<=140|B>=160))=255;
lot(:,:,1)=R1;
lot(:,:,2)=G1;
lot(:,:,3)=B1;

利用MATLAB对图像中物体进行计数_第3张图片
此时我们将得到药片彼此独立的图片,但由于药片表面为颗粒状并且图像存在噪声,因此我们需要除噪。
在这里我选择除噪的方法是将此图像二值化后进行腐蚀膨胀的操作。

I1=rgb2gray(lot);
subplot(152);imshow(I1);
thresh=graythresh(I1);
I2=im2bw(I1,thresh);
subplot(153);imshow(I2)
SE=strel('disk',2);
I3=imerode(I2,SE);
subplot(154);imshow(I3)
I3=~I3;                              %取反后腐蚀相当于膨胀
SE1=strel('disk',5);
I4=imerode(I3,SE1);
subplot(155);imshow(I4)

腐蚀是指黑色腐蚀白色,即黑色向周围扩张。
利用MATLAB对图像中物体进行计数_第4张图片
最后得到此图像,利用计数语句即可完成对白色区域的计数。
利用MATLAB对图像中物体进行计数_第5张图片利用MATLAB对图像中物体进行计数_第6张图片
腐蚀膨胀的程度可通过参数SE控制。
SE=strel(‘disk’,XX);
XX的值越大,即腐蚀膨胀的程度越厉害。

你可能感兴趣的:(图像处理)