去雾算法参考了一篇论文:
Kaiming He, Jian Sun, Xiaoou Tang.
Single Image Haze Removal Using Dark Channel Prior
大致内容是提出了一个叫做暗原色先验的东西来对有雾图像进行处理,十分巧妙,有兴趣者可以看看。这里使用OpenCV实现文中的去雾算法,然而论文提到的soft
matting未在本程序中实现。
代码如下:
#include
#include
#include
char tbarname1[] = "调节block";
//定义两个滑动条,用于调节参数
char tbarname2[] = "调节w";
//w是为了保留一部分的雾
int block=5;
int w1=80;
double w;
IplImage *src=NULL;
IplImage *dst=NULL;
//定义去雾函数如下
IplImage *quw(IplImage *src,int block,double w)
{
//图像分别有三个颜色通道
IplImage *dst1=NULL;
IplImage *dst2=NULL;
IplImage *dst3=NULL;
IplImage *imgroi1;
//dst1的ROI
IplImage *imgroi2;
//dst2的ROI
IplImage *imgroi3;
//dst3的ROI
IplImage *roidark;
//dark channel的ROI
IplImage *dark_channel=NULL;
//暗原色先验的指针
IplImage *toushelv=NULL;
//透射率
//去雾算法运算后的三个通道
IplImage *j1=NULL;
IplImage *j2=NULL;
IplImage *j3=NULL;
//去雾后的图像,三通道合并成
IplImage *dst=NULL;
//源图像ROI位置以及大小
CvRect ROI_rect;
//分离的三个通道
dst1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);
dst2=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);
dst3=cvCreateImage(cvSize(src->width,src->heigh