首页 > 代码库 > 图像去雾 第二次报告

图像去雾 第二次报告

图像去雾 第二次报告




           去雾理论基于是根据何凯明博士的论文成果来做的。Standing on the shoulder of gaints !


之前我关于去雾的第一次总结


由于采用最小值滤波去雾会出现“边界问题”



            当“前景”和“背景”在空间上相距较远时,暗通道的像素value会相差较大,最小值滤波和最大值滤波都会导致边界问题。



此时最理想的方法应该是中值滤波,然而中值滤波几乎完全不可避免的要对搜索框的数据进行排序,然后才能得到中值。排序是时间代价很大的操作,说的轻巧,但是如果让user去等待20s+估计没人买你产品了。

快速,优质的图像,是项目应该追求的最好目标,这应该是正方向,两者都不能抛弃



中值算法让这两个条件——快速,优质图像,变得异常艰难(最起码对于我这种渣渣来说,快排都不行,会等很久)。


尝试用均值去滤波

去雾前:                                                                    去雾后:



        



细心观察会发现,人物边缘,图像前景和背景分解的边缘,会有明显的可见白雾没有去除。

为此很苦恼,中值必须排序,排序就慢(做图像的数据量太大了).




在一副500*400像素的图片里面15*15的搜索框感觉算比较大的了,我们可以通过减小搜索框的大小来减小单次待处理的数据量(其实这样以来,总的计算次数也会下降!),而这几乎是一种手段,类似于数学里的非线性模型的小段微分之后的线性化看待,这样,只要框适当小,框内数据值波动不会很大,这很重要,即使在边界也会成立,影响不大。



于是,我尝试改良均值滤波。

用中值滤波和均值滤波结合来处理——”伪中值滤波“


for(square_row = row-SQUARE_LENGTH/2,sub = 0,sub_prev = 255;
			 	square_row < (row + SQUARE_LENGTH/2+1);
				square_row++)
			{
				for(square_col = col-SQUARE_LENGTH/2; square_col < (col+SQUARE_LENGTH/2 +1);square_col++)
				{
					if(square_row >= 0 && square_col >= 0 &&
					 square_row < (search_win_height_end) &&
					 square_col < (search_win_width_end))
					{
						sub = temp -  *(ptr_array_win_dark + (square_row)*(img_win_dark->width) + (square_col));
			                        //temp 是已经求得的搜索框像素值均值,做差,取差值最小的像素点的像素值
						if(sub_prev > sub)
						{
							sub_prev = sub;
							median_value =  http://www.mamicode.com/*(ptr_array_win_dark + (square_row)*(img_win_dark->width) + (square_col));>
处理思想:

通过先计算均值,然后找到搜索框内距离均值最近的点(该点的像素值不一定是均值,但是是最靠近的)

用这点的像素值作为滤波像素值。


边缘问题得到了很好的解决!





                                      


感觉效果蛮好的~



C 版本出来的效果和Matlab的效果几乎完全一致,赶脚可以达到预期目标。


—— EOF

        2014.08.16 下午 于XTU