同态滤波及图像去阴影

来源:互联网 发布:家道中落 知乎 编辑:程序博客网 时间:2024/05/16 17:44

图像照度不均匀,或者有阴影怎么进行二值化?相信长期做机器视觉的朋友都遇到过,下面分享我个人的一些经验,如果有更好的方法请不吝指出,共同进步。

1、图像亮度不均匀分析

一般情况下,图像f(x,y)是由光源产生的照度场i(x,y)和目标的反射系数场r(x,y)共同作用产生的,且前者可以表达成后二者的乘积,即:

f(x,y)     =     i(x,y) r(x,y)

r(x,y)反映的是目标表面颜色和纹理等特征,是我们最需要的信息。i(x,y)反映的是光源相对于目标的方位及强度分布。在机器视觉项目中,光源的布置及本身特性会造成对目标的照射不均匀。


2、同态滤波及去阴影

如果对f(x,y)做对数变换,可以将照度场i(x,y)与反射系数场r(x,y)分离开来,即

ln f(x,y)      =      ln i(x,y)  +  ln r(x,y)

再做傅里叶变换即

F{ln f(x,y)}      =      F{ln i(x,y)}  +  F{ln r(x,y)}

或者写为

G(u,v)      =     I(u,v)  +  R(u,v)

其中,G(u,v)、I(u,v)和R(u,v)分别是ln f(x,y)、ln i(x,y)和ln r(x,y)的傅里叶变换。

如果通过一个传递函数H(u,v)对G(u,v)进行处理,即

S(u,v)     =     H(u,v) G(u,v)     =     H(u,v)I(u,v)  +  H(u,v)R(u,v)

前面讲到,r(x,y)反映的是目标表面颜色和纹理等特征,可以看成是图像的高频成分,i(x,y)反映的是光源相对于目标的方位和强度分布,一般变化缓慢,可以看做图像的低频成分。如果H(u,v)选择合适的高通滤波器,由上面公式可以看出目标特征可以得到保持,而低频的照度不均会得到抑制。

对S(u,v)进行傅里叶反变换之后再做指数运算,即可得到原图像的同态滤波结果。

另外,在频域里对G(u,v)乘以H(u,v)等效于在空域里对ln f(x,y)以H(u,v)的傅里叶反变换为卷积核做卷积。下面的Matlab示例我们就采用这种方法。


3、Matlab示例

clear;close all;%加载原始图像img = imread('graph.bmp');figure, imshow(img);title('初始图像');%构造高通滤波器filter1 = fspecial('gaussian', [7 7], 0.6);filter2 = fspecial('gaussian', [7 7], 1.2);high_pass = filter1 - filter2;%利用对数变换将入射光和反射光部分分开log_img = log(1.0 + double(img));%将高斯高通滤波器与对数转换后的图像卷积high_log_part = imfilter(log_img, high_pass, 'symmetric', 'conv');%显示卷积后的图像figure, imshow(high_log_part);%幂变换回来high_part = exp(high_log_part) - 1.0;minv = min(min(high_part));maxv = max(max(high_part));%显示结果图像resultImg = (high_part - minv) / (maxv - minv);figure, imshow(resultImg);title('同态滤波结果');imwrite(resultImg, 'homoResult.bmp');
如下图所示,左边为原图,右边为同态滤波后的结果,可以看出图像整体上亮度变得均匀了。但是图像高频部分也受到了一定的影响,这可以通过构造更合适的高通滤波器进行改善。




4、结语

同态滤波是改善图像照度不均的一种方法,以便于后续二值化等操作。但是对于照度不均匀或阴影图像还有另外一些自适应二值化的方法,我会在以后文章中跟大家分享。

2 0
原创粉丝点击