图像去雾
我的个神啊~ 调了这么久终于阶段性“胜利了” —— 利用最小值滤波正确实现图像去雾。
因为是C语言实现,很多细节都要注意,很砸时间——本来看起来很简单的程序,就是有bug,debug的时间很长了,这也是一种锻炼吧,难得的实战机会。磨C 这把刀这么久了,是该做做具体应用了!刀子是否锋利,要接受考验!
程序很大程度上没有利用OpenCV的一些数据操作的接口,除了图像显示和读取之外,其他的数据处理部分都是自己实现的。这几天的时间全砸进去了~ 暑假哇~时间过的慢点可好~
由于项目正在进行中,代码目前不能开源,等项目结题之后,一定公开代码实现。
不废话了。入正题:
int mininum_filter(IplImage* const img_origin, IplImage* const img_win_dark, IplImage* const img_af_filter); int defog(IplImage* const img_origin, IplImage* const img_win_dark, IplImage* const img_af_filter, IplImage* const img_temp); int get_win_dark(IplImage* const img_origin,IplImage* const img_win_dark); double max_value_in_picture(IplImage* const img); double average_value_in_picture(IplImage* const img);
上面是程序关键的接口部分。
首先defog函数是实际操作主函数,调用mininum_filter,
get_win_dark, max_value_in_picture, average_value_in_picture.四个函数。
int mininum_filter(IplImage* const img_origin, IplImage* const img_win_dark, IplImage* const img_af_filter);
img_origin 指向原始图片的结构体
img_win_dark用于指向dark channel 暗通道(RGB图像经过取三原色最小值后得到的图像)
img_af_filter用于指向最小值滤波之后得到的图像
double max_value_in_picture(IplImage* const img); double average_value_in_picture(IplImage* const img);
这俩个函数则负责实现从传入图片中找出全图像素值最大值以及全图的像素值平均值
酷帅的前辈搞出来的理论:
大一很有“冲劲”,极力批判大学里的东西学了不用,学习不面向应用,面向社会,学习有什么用?!于是很强调动手能力,想动手做东西,各种问学长,想进实验室做东西,后来慢慢发现,也领悟到,没有强大到“深厚”的理论基础,应用是做不出来的,而另一方面,也不能死读书,不能光搞理论。让想做什么指导想学什么! 这段话出现在这里是为了反省自己,提醒自己,要积累厚实的理论基础。不能抛弃理论。我想很多童鞋大一的时候会有和我一样的想法。仅此炮灰提醒。
我get到的去雾的理论:
生活中常遇到雾霾天气,这时候人的视觉画面变得不够清晰,影响 人们的正常生活。既然都影响正常生活了,去雾的必要性就很大了,汽车驾驶员如果急忙在雾霾天去赶路,高速上,如果能通过监控器看清路面,这里去雾的意义就上升到了保证生命安全!图像去雾是很有必要的!
下面是生活中常见的有雾场景:
下图就是一个去雾的例子:
左边有雾的图像经过去雾处理得到比较清晰的图像(这是多么神奇而又有意思的事情!)
这是贯穿实现代码的最核心的去雾公式:
左边的是有雾的原图像,A是大气光强系数,J是我们希望得到的去雾后图像,t是传递矩阵
暗通道——Dark channel
彩色图像是通过三原色构成的(理解这个很重要,C程序实现的细节要对内存进行操作);
然后这里dark channel就是取每个pixel‘s mininum value.,然后利用一定的窗口大小对得到的图像进行滤波,即可得到dark channel。
最后我目前程序处理之后输入输出对比图:
我都不知道看这几个家伙的脸看了多少遍了~~~Bug啊bug。。。
改进目标:
用最小值滤波显然有不住之处(看那天安门三个人的“光环”。。。),物件周围的雾没有去掉,以至于留下一圈“光环”
已经找到解决办法——中值去雾。然而这又又另一个问题(已经测试过了),中值去雾要对搜索框里的所有数值进行排序,我采用的普通冒泡排序速度都不行,程序运行比较慢,目前打算改成quick sort 试试,能不能有明显的提升。 最小值去雾和中值去雾由于数据排序取值的问题导致两种方案的时间复杂度完全无不一样了。。。
上帝保佑我明天改的时候,改成快排能保证程序运行的速度~
2014.08.11凌晨 于XTU
图像去雾 利用最小值滤波(待改进)