在我们平时看到的图片当中,我们所关注的物体主要是图片中前景的目标物体,所以对图片中前景可能存在的目标进行检测是有一定的应用。目标检测的算法很多,想要达到一个很高精度的前景目标检测的算法很复杂。对于一个小白(比如我)来说还是非常困难的。那么我就将就地简单编写了一个图片前景物体目标检测的matlab程序,这个程序很简短,思路也很简单。首先就是用一个半径为25的圆来跟图片进行运算。提取出图片的背景,然后用原图减去背景,重复几次来更加干净地减去背景。最后对去背景的图像进行二值化处理,并标注二值化图片的8连通域,最后选择较大的连通域进行前景物体画框标注。 由于程序简单,面临着很多问题,比如前景背景区分度不明显的图片,如图片中物体过多,颜色多样鲜明,就很难准确标注出前景目标。
img=imread('E:\DigitalImage\前景物体检测\img\img3.jpg'); img1=img; subplot(2,2,1); imshow(img); title('原图'); [M N C]=size(img); for i=1:10%多次循环去除背景 background=imopen(img,strel('disk',25)); img=imsubtract(img,background); end subplot(2,2,2); imshow(img); title('去背景原图'); img_gray=rgb2gray(img);%灰度化二值化去背景图片 leve=graythresh(img_gray); %leve=graythresh(imgabs); bw=im2bw(img_gray,leve); SE=ones(7,7);%腐蚀膨胀消除细微影响 for i=1:4 bw=imerode(bw,SE); bw=bwmorph(bw,'dilate',9); end subplot(2,2,3); imshow(bw); title('处理后前景目标二值图'); [L,num]=bwlabel(bw,8);%标注二值化图片8连通域 STATS=regionprops(L,'basic'); subplot(2,2,4); imshow(img1); title('前景目标检测'); for i=1:num%框出可能的前景物体 if (STATS(i).BoundingBox(3)>M/4||STATS(i).BoundingBox(4)>M/4||STATS(i).BoundingBox(3)>N/4||STATS(i).BoundingBox(4)>N/4) rectangle('Position',STATS(i).BoundingBox,'EdgeColor',[1,0,0]); end end实验结果: