1.進行最大(最小)值濾波初步得到光照圖
2.進行均值(或高斯)濾波得到最終的光照分布圖
3.原始圖像減去光照圖,得到前景目標
壹個栗子
拿matlab中自帶的rice.png圖舉例。我們希望能夠把大米和背景區分開來,直觀的做法是用閾值分割來做成二值圖,再對聯通區域進行標記,這樣就能知道每個大米的大小和中心位置。
可是仔細觀察大米圖會發現攝像時光照不均勻,這樣就很難用壹個全局閾值去進行分割,如果直接分割的話會導致壹部分背景被識別為目標(閾值偏小)或者丟失部分目標(閾值偏大)。如果把光照的不均勻去掉,再做二值化的結果如何呢?
代碼
function newIm= DUCO_RemoveBackGround(im,w,isShow)
%im:原始圖像;w 濾波窗體大小;isShow 是否顯示中間過程
%
%
if isShow==1
figure
imshow(im,[])
end
bk=double(im);
%1.最小值濾波
bk=ordfilt2(bk,1,ones(w,w),'symmetric');
if isShow==1
figure
subplot(2,2,1)
imshow(bk,[]),title('最小值濾波之後的結果'); %顯示濾波後的圖象
end
%2.均值濾波
h=ones(w,w)/(w*w);
bk=imfilter(bk,h,'replicate');
if isShow==1
subplot(2,2,2)
imshow(bk,[]),title('均值濾波之後的結果'); %顯示濾波後的圖象
end
%3.減掉亮度不均的結果
newIm=imsubtract(double(im),bk);
if isShow==1
subplot(2,2,3)
imshow(newIm,[]);title('去背景圖');
end
%4.二值化分割出目標
th=graythresh(newIm/255);
newIm=im2bw(newIm/255,th);
if isShow==1
subplot(2,2,4)
imshow(newIm),title('二值化的結果'); %顯示濾波後的圖象
end
end