目录
一、理论基础
二、核心程序
三、仿真测试结果
作者ID :fpga和matlab
CSDN主页:https://blog.csdn.net/ccsss22?type=blog
擅长技术:
1.无线基带,无线图传,编解码
2.机器视觉,图像处理,三维重建
3.人工智能,深度学习
4.智能控制,智能优化
5.其他
阴影是自然界中普遍存在的一种物理现象,图像中阴影的存在会对物体识别、目标追踪等计算机视觉的相关问题造成不利的影响,因此研究图像中阴影的检测和去除算法是十分必要的。当一个光源的光线由于其他物体的阻挡不能够达到一个物体的表面的时候,那么这个物体就在阴影中了。阴影能够使场景看起来真实得多,并且可以让观察者获得物体之间的空间位置关系。阴影对于真实感场景绘制具有重要的意义,不仅能够反映空间中物体之间的相互遮挡关系,也能反映遮挡物以及接收表面的几何信息,阴影的实时绘制还大大增加了场景绘制的真实度,阴影绘制技术主要有阴影图算法和阴影体算法两类,与阴影体算法相比,阴影图算法具有与场景复杂度无关、易于实现以及受图形硬件支持等优点,它在业界得到了更广泛的应用。
阴影作为图像退化的一种特殊形式,其存在会对机器视觉图像的信息造成一定的损失或干扰,这在计算机图像处理过程中将直接导致相应区域的边缘提取、目标识别以及影像匹配等算法的结果不稳定甚至失败。静态图像中的阴影处理一直是一个比较困难的问题,在分析了阴影的成因和光谱属性的基础上,对静态图像中的阴影检测和阴影去除算法进行了研究。阴影检测是阴影处理算法的基础,阴影检测算法的准确性直接影响之后阴影去除算法的效果。本文首先总结概括了现有的几种阴影检测算法,并对它们进行了详细的优缺点分析。最近的研究表明,对立色彩空间中的红-绿通道与阴影具有最大的无关性。
阴影虽能为图像深度和物体几何形状预估等计算机视觉研究工作提供重要依据,但其存在也会加大物体检测、目标跟踪等任务的难度。阴影去除常包含阴影定位和去阴影这两个步骤。在阴影定位过程中,文献[1-3]中使用阴影检测的方法:
[1]GUO R, DAI Q, HOIEM D. Paired regions for shadow detection and removal [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2013, 35(12): 2956-2967.
[2]KHAN S H, BENNAMOUN M, SOHEL F, et al. Automatic shadow detection and removal from a single image [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2016, 38(3): 431-446.doi:10.1109/TPAMI.2015.2462355.
[3]张营,朱岱寅,俞翔,等.一种VideoSAR动目标阴影检测方法[J].电子与信息学报,2017,39(9):2197-2202. doi: 10.11999/JEIT161394.ZHANG Ying, ZHU Daiyin, YU Xiang, et al.. Approach to moving targets shadow detection for VideoSAR[J]. Jounal of Electronics & Information Technology, 2017, 39(9): 2197-2202. doi: 10.11999/JEIT161394.
文献[4]中的深度网络能够学习阴影检测所需要的特征,但受到数据集规模的限制,这两个网络层次都较浅。
[4]SHEN L, CHUA T W, LEMAN K. Shadow optimization from structured deep edge detection [C]// Proceedings of the 2015 IEEE Conference on Computer Vision and Pattern Recognition. Piscataway, NJ: IEEE, 2015: 2067-2074.doi:10.1109/CVPR.2015.7298818.
文献[5-6]中通过比较光照不变图和原始RGB图像进行阴影检测,然后提出一系列基于梯度的方法进行阴影去除。但这些基于梯度的方法仅仅只改变阴影边界或半阴影区域的梯度变量,因此对于全阴影区域的光照变量并不适用。
[5]FINLAYSON G D, HORDLEY S D, DREW M S. Removing shadows from images [C]// Proceedings of the 2002 European Conference on Computer Vision, LNCS 2353. Berlin: Springer, 2002: 823-836.doi:10.1007/3-540-47979-1_55.
[6]FINLAYSON G D, HORDLEY S D, LU C, et al. On the removal of shadows from images [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2006, 28(1): 59-68.doi:10.1109/TPAMI.2006.18.
图像中的阴影会对计算机视觉图像信息产生干扰,引起图像质量下降,并导致物体分割,目标识别及追踪等处理结果不稳定甚至失败,严重影响了计算机视觉图像处理算法的性能. 首先,以光度学和色度学的相关理论为基础,介绍了光源模型,光反射模型和成像模型的建立方法,以及几种常用的颜色模型,并在此基础上分析了阴影的成因及性质. 在阴影检测算法研究中,首先,研究了两种阴影检测算法,介绍了它们的工作原理和实现方法,并分析了其优缺点.这两种检测方法分别以光照无关图和颜色特征不变性为基础,并且均建立于人眼视觉系统的三色学说基础上.与同表面非阴影区域相比,图像中阴影区域一般会具有以下特征:其亮度会明显比非阴影区域低;与非阴影区域有分界,界线宽度一般不大,在界线上存在渐变;阴影区域的颜色通道比例和非阴影区域比较接近。我们可以利用这些特征来完成阴影检测的工作。
在白天的户外环境中,主要存在两种光源:太阳光的直射,和天空的光线散射。非阴影区域同时受到了太阳光的直射和天空的光线散射,而阴影区域则没有太阳光的直射,只存在天空的光线散射。显然,太阳光的直射强度要大大高于天空的光线散射强度。对于阴影区域,它和阳光直射区域的差即为太阳直射的颜色分布。如果能够将太阳直射下颜色在三个通道的构成比例计算出来的话就可以很好的辅助进行阴影检测。
对于阴影检测:
通过上述公式,可以将影子的区域及边缘进行有效的提取。删除阴影时,有注意。由于图像是灰度图像,如果图像背景较浅且对象较暗,则必须先执行最大滤波,然后再执行最小滤波。如果图像背景较暗且物体较亮,我们可以先执行最小滤波,然后再进行最大滤波。
对于阴影消除:
通过上述过程,我们可以完成阴影区域的像素重建,继而完成图像的恢复。图像复原技术的主要目的是以预先确定的目标来改善图像,大部分是一个客观的过程。图像复原试图利用退化现象的某种先验知识来复原被退化的图像。因而,复原技术是面向退化模型的,并且采用相反的过程进行处理,以便恢复出原图像。
以上,我参考的文献:
%%
%图像恢复
for i = 1:r
for j = 1:c
if BW(i,j) == 1
Io3(i,j,1) = 0;
Io3(i,j,2) = 0;
Io3(i,j,3) = 255;
else
Io3(i,j,1) = I(i,j,1);
Io3(i,j,2) = I(i,j,2);
Io3(i,j,3) = I(i,j,3);
end
end
end
figure(2);
imshow(Io3);title('阴影边缘检测效果');
%计算阴影边界例外L个像素点的像素变换
%计算I_modelled
L = 7;%阴影变换过度区间
ind = 0;
hL = (L-1)/2;
for i = hL+2:r-hL-2
for j = hL+2:c-hL-2
if Io(i,j) == 255
if (BW(i,j) == 1 & BW(i,j-1) == 0 & BW(i,j-2) == 0 & BW(i,j-3) == 0 & BW(i,j+1) == 0 & BW(i,j+2) == 0 & BW(i,j+3) == 0 )
ind = ind + 1;
for n = L:-1:1
I_min1{ind} = min(min(I(i,j-hL:j+hL,1)));
I_min2{ind} = min(min(I(i,j-hL:j+hL,2)));
I_min3{ind} = min(min(I(i,j-hL:j+hL,3)));
I_max1{ind} = max(max(I(i,j-hL:j+hL,1)));
I_max2{ind} = max(max(I(i,j-hL:j+hL,1)));
I_max3{ind} = max(max(I(i,j-hL:j+hL,1)));
I_modelled1{ind}(n) = I_min1{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max1{ind} - I_min1{ind});
I_modelled2{ind}(n) = I_min2{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max2{ind} - I_min2{ind});
I_modelled3{ind}(n) = I_min3{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max3{ind} - I_min3{ind});
I01{ind} = I(i,j+hL-1:-1:j-hL-1,1);
I02{ind} = I(i,j+hL-1:-1:j-hL-1,2);
I03{ind} = I(i,j+hL-1:-1:j-hL-1,3);
end
end
if (BW(i,j) == 1 & BW(i-1,j) == 0 & BW(i-2,j) == 0 & BW(i-3,j) == 0 & BW(i+1,j) == 0 & BW(i+2,j) == 0 & BW(i+3,j) == 0 )
ind = ind + 1;
for n = L:-1:1
I_min1{ind} = min(min(I(i-hL:i+hL,j,1)));
I_min2{ind} = min(min(I(i-hL:i+hL,j,2)));
I_min3{ind} = min(min(I(i-hL:i+hL,j,3)));
I_max1{ind} = max(max(I(i-hL:i+hL,j,1)));
I_max2{ind} = max(max(I(i-hL:i+hL,j,1)));
I_max3{ind} = max(max(I(i-hL:i+hL,j,1)));
I_modelled1{ind}(n) = I_min1{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max1{ind} - I_min1{ind});
I_modelled2{ind}(n) = I_min2{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max2{ind} - I_min2{ind});
I_modelled3{ind}(n) = I_min3{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max3{ind} - I_min3{ind});
I01{ind} = I(i+hL-1:-1:i-hL-1,j,1);
I02{ind} = I(i+hL-1:-1:i-hL-1,j,2);
I03{ind} = I(i+hL-1:-1:i-hL-1,j,3);
end
end
end
end
end
%计算I_Restored
I_Restored = I;
ind = 0;
for i = hL+2:r-hL-2
for j = hL+2:c-hL-2
if Io(i,j) == 255
if (BW(i,j) == 1 & BW(i,j-1) == 0 & BW(i,j-2) == 0 & BW(i,j-3) == 0 & BW(i,j+1) == 0 & BW(i,j+2) == 0 & BW(i,j+3) == 0 )
ind = ind + 1;
for n = L:-1:1
I_Restored1{ind}(n) = I_max1{ind} * (double(I01{ind}(n))/double(I_modelled1{ind}(n)));
I_Restored2{ind}(n) = I_max2{ind} * (double(I02{ind}(n))/double(I_modelled2{ind}(n)));
I_Restored3{ind}(n) = I_max3{ind} * (double(I03{ind}(n))/double(I_modelled3{ind}(n)));
end
end
if (BW(i,j) == 1 & BW(i-1,j) == 0 & BW(i-2,j) == 0 & BW(i-3,j) == 0 & BW(i+1,j) == 0 & BW(i+2,j) == 0 & BW(i+3,j) == 0 )
ind = ind + 1;
for n = L:-1:1
I_Restored1{ind}(n) = I_max1{ind} * (double(I01{ind}(n))/double(I_modelled1{ind}(n)));
I_Restored2{ind}(n) = I_max2{ind} * (double(I02{ind}(n))/double(I_modelled2{ind}(n)));
I_Restored3{ind}(n) = I_max3{ind} * (double(I03{ind}(n))/double(I_modelled3{ind}(n)));
end
end
end
end
end
S = zeros(r,c,3);
NS = zeros(r,c,3);
%显示最后的恢复效果
ind = 0;
Num_s = 0;
Num_ns = 0;
for i = 1:r
for j = 1:c
if Io(i,j) == 255
S(i,j,1) = I(i,j,1);
S(i,j,2) = I(i,j,2);
S(i,j,3) = I(i,j,3);
NS(i,j,1) = 0;
NS(i,j,2) = 0;
NS(i,j,3) = 0;
Num_s = Num_s + 1;
else
S(i,j,1) = 0;
S(i,j,2) = 0;
S(i,j,3) = 0;
NS(i,j,1) = I(i,j,1);
NS(i,j,2) = I(i,j,2);
NS(i,j,3) = I(i,j,3);
Num_ns = Num_ns + 1;
end
end
end
·测试图片1的仿真结果如下所示:
从上面的仿真可以看到,塔的影子基本被消除,并且在原来影子的地方,恢复出了原来的颜色。
·测试图片2的仿真结果如下所示:
从上面的仿真可以看到,马路的影子基本被消除,并且在原来影子的地方,恢复出了原来的路面的颜色。
·测试图片3的仿真结果如下所示:
从上面的仿真可以看到,人的影子基本被消除,并且在原来影子的地方,恢复出了原来的路面的颜色。
A21-03