由于雨水对光线的高反射,雨水在图像中通常被成像为明亮的条纹,进而会影响图像的视觉质量。摄影师可以调整曝光时间和景深这些参数来限制拍摄到雨线。然而,这种方法只能在很小程度上避免雨纹,并且不适用雨车载摄像头使用。因此,对于大多数采集到的雨图像来说,找到一种算法来去除图片中的雨纹是必要的。本节将采取主成分分析法对雨条纹进行特征描述和细化处理,通过中值滤波将雨线与之邻近的无雨背景层进行映射来恢复图像。
本人已做项目如下,其他代码需求也可以联系哦!资源大把! 好了废话不多说,开讲去雨项目!
下图为区域过程图片。
雨图可以表示为:I=B+R
I为雨图,B为背景层,R为雨层
为了得到良好的去雨图像,当务之急是要使得雨图像的低频背景层和高频线特征层分离。首先,Wan发现雨滴通常对光线有很强的反射,所以它们的像素强度明显比背景像素大,利用该理论得到了粗糙的二值图像 M,并把高频雨线成分视为 1 值,背景层视为 0 值。这种方法可以粗略提取出雨图像的高频信息,把一些无关紧要的信息进行忽略。
然而,二值图像 M 包括了高频细节信息和雨线信息,需要进一步的将高频雨线与高频细节层分离。本文采用主成分分析法,对图像 M 中的连通区域进行分析来获取细化的二值图像 Mf,如图 1©所示。所谓连通区域是指图像中具有相同的像素值,而且彼此位置相邻的前景像素点所构成的图像区域。针对二值图像 M来说,前景像素点即为图像中白色区域,通过把每个单独区域的特征进行分析可以进一步的优化二值图像。
进行连通区域求取之前,需要确定雨线特征,对特征进行阈值划分来达到将二值图像 M 中的高频雨线与高频细节分离的效果。一般来说,雨线在图像中的分布比较均匀且形状大体固定。因此可以将雨线进行特征描述,具体的见图 中的局部放大图,本文把图像中雨线特征描述为长为 L,宽为 W,倾斜角为 β 的红色椭圆区域。根据长宽比、长、倾斜角的定义,进一步的遍历 图中各个独立的连通区域,求取连通区域长宽比、倾斜角、长度的情况。通过得到的长、宽、倾斜角度与设定的雨线特征阈值的比较,可以判断出连通区域是否属于雨线部分,进而可以将其分离主要采用引导滤波和主成分分析 以及神经网络进行雨线的去除,将无雨图像作为目标标签进行训练。
代码如下
ef pre_mark(I,b,g,r):
w1=w2=7
K_Left_Up = np.zeros((2*w1-1, 2*w2-1))
K_Right_Up = np.zeros((2*w1-1, 2*w2-1))
K_Center = 1/(w1*w2)*np.ones((w1, w2))
K_Left_Down =np.zeros((2*w1-1, 2*w2-1))
K_Right_Down = np.zeros((2*w1-1, 2*w2-1))
K_Left_Up[0:w1, 0:w2] = 1/(w1*w2)*np.ones((w1, w2))
# print(K_Left_Up.shape)
K_Right_Up[0:w1,w2-1:2*w2] = 1/(w1*w2)*np.ones((w1, w2))
# print(K_Right_Up)
K_Left_Down[w1-1:2*w1, 0:w2] = 1/(w1*w2)*np.ones((w1, w2))
K_Right_Down[w1-1:2*w1, w2-1:2*w2] = 1/(w1*w2)*np.ones((w1xiaog, w2))
#LU
b1=scipy.ndimage.filters.convolve(b, K_Left_Up, mode='nearest')
g1=scipy.ndimage.filters.convolve(g, K_Left_Up, mode='nearest')
r1=scipy.ndimage.filters.convolve(r, K_Left_Up, mode='nearest')
I_LU=cv2.merge((b1,g1,r1))在这里插入代码片
#RU
b2=scipy.ndimage.filters.convolve(b, K_Right_Up, mode='nearest')
g2=scipy.ndimage.filters.convolve(g, K_Right_Up, mode='nearest')
r2=scipy.ndimage.filters.convolve(r, K_Right_Up, mode='nearest')
I_RU=cv2.merge((b2,g2,r2))
#C
b3=scipy.ndimage.filters.convolve(b, K_Center, mode='nearest')
g3=scipy.ndimage.filters.convolve(g, K_Center, mode='nearest')
r3=scipy.ndimage.filters.convolve(r, K_Center, mode='nearest')
I_C=cv2.merge((b3,g3,r3))
#LD
b4=scipy.ndimage.filters.convolve(b, K_Left_Down, mode='nearest')
g4=scipy.ndimage.filters.convolve(g, K_Left_Down, mode='nearest')
r4=scipy.ndimage.filters.convolve(r, K_Left_Down, mode='nearest')
I_LD=cv2.merge((b4,g4,r4))
#RD
b5=scipy.ndimage.filters.convolve(b, K_Right_Down, mode='nearest')
g5=scipy.ndimage.filters.convolve(g, K_Right_Down, mode='nearest')
r5=scipy.ndimage.filters.convolve(r, K_Right_Down, mode='nearest')
I_RD=cv2.merge((b5,g5,r5))
同时,在真实数据集参数对比中,本文所提算法依旧拥有良好的表现,,本文所提算法结果在 PSNR 和 SSIM 参数中均高于对比算法。
欢迎被代码困住的 被debug缠身的小伙伴交流解决,视觉相关代码,单目测距,论文撰写,(yolo,presacn,matlab,c++)皆可交流哦------------------------!