消除圖像處理中的光照不均(matlab版)

步驟

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

結果

這裏寫圖片描述

其實右上的圖就是背景的光照分佈。最後的二值圖中還是存在一些白色的噪聲點,可以在小窗體範圍內,做一個最小值濾波再做一個最大值濾波,這樣既消除了噪聲又保證目標的邊緣不會被破壞。

發佈了37 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章