消除图像处理中的光照不均(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

结果

这里写图片描述

其实右上的图就是背景的光照分布。最后的二值图中还是存在一些白色的噪声点,可以在小窗体范围内,做一个最小值滤波再做一个最大值滤波,这样既消除了噪声又保证目标的边缘不会被破坏。

图像处理以及编解码适合做一些轻量应用,比如这个转文档小工具
在这里插入图片描述

内容出自南京理工研究生课程数字图像处理课件

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值