图像处理去阴影算法

2017-10-24 20:07:49 piaoxuezhong 阅读数 7904

暗角的概念

暗角一词属于摄影术语,是指一幅图像的四周的亮度或饱和度相比于中间部分的降低,画面四角有变暗的现象。暗角对于任何相机设置或镜头都不可避免。当然有时会故意引入暗角这种效果。

产生暗角的原因

(1)边角的成像光线与镜头光轴有较大的夹角是主要原因。沿着视场边缘的光线的前进方向看光圈,由于光线与光圈所在的平面有夹角,看到的光圈是椭圆的,所以通光面积减小。镜头光心到胶片的边缘距离较大,同样的光圈直径到达底片的光线夹角较小,亮度必然减小。同理,同样的光线偏角,对于边角光线位移较大,等价于照在较大的面积上。而面积是与位移的平方成正比的,所以综合上述原因,边缘亮度与光线和光轴夹角的cos值的4次方成正比。换句话说,广角镜头的边缘亮度随着视角变大急剧下降。


(2)长焦镜头,尤其是变焦长焦镜头,镜片很多,偏离光圈比较远的镜片为了能让边角光线通过,这些镜片必须很大。为了降低成本,缩小了这些镜片直径,造成边角成像光线不能完全通过,降低了边角的亮度。
(3)边角的像差较大。为了提高像质,某些镜片的边缘或专门设置的光阑有意挡住部分影响成像质量的边缘光线,造成边角失光。

暗角的分类

(1)自然暗角:表现为照片四角平缓暗化的渐变效果,这主要是由不同位置的光照进相机传感器的角度不同造成的。这种类型的照片暗角在用广角镜头拍摄的时候最为明显。:
(2)光学暗角:渐变同样也很平缓,但是它形成的主要原因是由镜头的固有特性,或者由镜筒自身的阴影造成。光学暗角也最终决定了一个镜头的成像圈的尺寸。这种暗角多在使用大光圈的情况下出现,并且受特定的镜头设计的影响很大。
(3)机械暗角:通常非常突兀,且只存在于照片的四角,通常是由遮光斗、滤镜环或其他安置在镜头前的遮光器材造成的。这种暗角如果由大光圈镜头或者变焦镜头来拍的话渐变效果就会略微平缓一些,没有那么突兀,也可以使用长焦从而避免这种效果。

po几张带暗角效果的原始图像:



去暗角算法

去阴影的算法有多种,例如参考【7,8】里的方法,本文主要讨论基于熵的去暗角算法,在论文《Retrospective shading correction based on entropy minimization》【1】中介绍了基于熵最小化的阴影校正(暗角自然也是一种阴影形式)方法,另外论文【2】《Single-Image Vignetting Correction by Constrained Minimization of log-Intensity Entropy》进一步讨论了论文【1】中方法的局限,主要是指局部最优的问题,并提出了一种基于对数熵的方法,这里大概讲述一下论文【2】中方法的思路,另见参考[4]。其主要内容有三部分:一是关于对数熵的评价准则;二是阴影去除方法的建模;三是模型参数的优化,使得熵值最小。

(1)对数熵

关于熵的概念,有点抽象,在维基里有很详细的解释,请参见:https://en.wikipedia.org/wiki/Entropy,这里只po一下连续随机变量的信息熵公式:

,

其中,X为图像灰度的分布,f(x)为概率密度函数,当X乘以一个参数c时,熵变为:


当c>1时,ln|c|>0.

(2)暗角建模

首先将灰度进行对数映射:

即将[0,255]的像素值基于对数关系映射到[0, N-1]内,通常N取256,这样映射后的像素范围还是[0,255]。映射后的直方图为:

那两个数学符号了,是向上取整和向下取整的意思,作和是一种线性权重取值方式。此时的对数熵直方图由于巨大的色阶调整,会出现直方图信息缺失,需要进行高斯平滑得到新的直方图。经过高斯平滑后的离散熵为:

论文给出的阴影函数反函数,也称增益函数g 为:

, g的范围为:1<g<1

其中,(x,y)是图像点坐标,x,y均值表示图像的中心位置。可以看到,当r=0时,校正系数=1,即无需校正。当r=1时,校正系数为1+a+b+c。经过暗角校正后的图像就为:


图像从暗角的中心点到四周是逐渐变暗的,函数g是随着r单调递增的,因此函数g的一阶导数大于0,即:

,由r>0,可以得到:

,令q2=r,那么转换为:

,方程解为:

,根据g在所属范围内的单调递增特性,推出C1~C5,并保证了r=0和1时,g>0,并且在范围0~1内,g不等于0;


(3)参数最优化

在第二部分,建立暗角模型后,问题便转化为一个最优化问题,最优条件是调参使得对数熵最小。文中介绍的求最优方法是爬山法:即从一个随机的初始解开始,逐步找到一个最优解。 因为模型中有多个参数,通过爬山法逐步获得最优解的过程中可以依次分别将某个参数的值增加或者减少一个单位。

算法实现:(待完成)

参考:

  1. https://en.wikipedia.org/wiki/Vignetting
  2. http://blog.csdn.net/omade/article/details/17449471
  3. http://www.xinpianchang.com/e881
  4. http://www.cnblogs.com/Imageshop/p/6166394.html
  5. http://blog.csdn.net/grafx/article/details/68958815
  6. 《Single-Image Vignetting Correction by Constrained Minimization of log-Intensity Entropy》[J].IEEE
  7. 《Single-Image Vignetting Correction》[J].IEEE
  8. 《Single-Image Vignetting Correction Using Radial Gradient Symmetry》[J].IEEE
2014-06-07 10:46:19 zhuangxiaobin 阅读数 2531

这是利用数学算法,进行高难度图像处理的一个例子。事实上,图像处理的数学算法,已经发展到令人叹为观止的地步。

Scriptol列出了几种神奇的图像处理算法,让我们一起来看一下。

一、像素图生成向量图的算法

数字时代早期的图片,分辨率很低。尤其是一些电子游戏的图片,放大后就是一个个像素方块。Depixelizing算法可以让低分辨率的像素图转化为高质量的向量图。

二、黑白图片的着色算法

让老照片自动变成彩色的算法

三、消除阴影的算法

不留痕迹地去掉照片上某件东西的阴影的算法

四、HDR照片的算法

  

 

 

 

所谓"HDR照片",就是扩大亮部与暗部的对比效果,亮的地方变得非常亮,暗的地方变得非常暗,亮暗部的细节都很明显。

实现HDR的软件有很多,这里推荐G'MIC。它是GIMP图像编辑软件的一个插件,代码全部开源。

五、消除杂物的算法

所谓"消除杂物",就是在照片上划出一块区域,然后用背景自动填补。Resynthesizer可以做到这一点,它也是GIMP的一个插件。

六、自动合成照片的算法

根据一张草图,选择原始照片,然后把它们合成在一起,生成新照片。这是清华大学的科研成果

七、美容算法

自动对容貌进行"美化"的算法

 

转载自:http://www.ruanyifeng.com/blog/2011/08/amazing_algorithms_of_image_processing.html

2013-08-07 14:09:11 todayq 阅读数 3076

一、像素图生成向量图的算法

数字时代早期的图片,分辨率很低。尤其是一些电子游戏的图片,放大后就是一个个像素方块。Depixelizing算法可以让低分辨率的像素图转化为高质量的向量图。

二、黑白图片的着色算法

让老照片自动变成彩色的算法

三、消除阴影的算法

不留痕迹地去掉照片上某件东西的阴影的算法

四、HDR照片的算法

所谓"HDR照片",就是扩大亮部与暗部的对比效果,亮的地方变得非常亮,暗的地方变得非常暗,亮暗部的细节都很明显。

实现HDR的软件有很多,这里推荐G'MIC。它是GIMP图像编辑软件的一个插件,代码全部开源。

五、消除杂物的算法

所谓"消除杂物",就是在照片上划出一块区域,然后用背景自动填补。Resynthesizer可以做到这一点,它也是GIMP的一个插件。

六、自动合成照片的算法

根据一张草图,选择原始照片,然后把它们合成在一起,生成新照片。这是清华大学的科研成果

七、美容算法

自动对容貌进行"美化"的算法

2016-02-01 15:48:41 wangzhen_cv 阅读数 7364

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

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、结语

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

2016-07-02 22:44:29 qq_26499769 阅读数 6406

相应的文章:

The Shadow Meets the Mask:

Pyramid-Based Shadow Removal


文章的主体思想:

1.进行区域分割选取出需去除的阴影部分、光亮的部分

2.阴影部分的均值、方差、还有光亮部分的均值方差。通过均值比和标准差比可以利用下边两式求解,

这样便可预估参数



方程来源推导是该部分:






同时根据阴影部分的数据,这样可以得到光亮时的数据了

3.在区域还原时,会有阴影边缘会有一部分像素无法计算,这里的值使用去水印的方式,使用图像恢复还原。


阴影算法技术讲解

阅读数 5045