在我們平時看到的圖片當中,我們所關注的物體主要是圖片中前景的目標物體,所以對圖片中前景可能存在的目標進行檢測是有一定的應用。目標檢測的演演算法很多,想要達到一個很高精度的前景目標檢測的演演算法很複雜。對於一個小白(比如我)來說還是非常困難的。那麼我就將就地簡單編寫了一個圖片前景物體目標檢測的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
實驗結果: