这是一个简化的实现算法,完整的算法请参考:

Single Image Haze Removal Using Dark Channel Prior ——CVPR 2009

// define head function
#ifndef PS_ALGORITHM_H_INCLUDED
#define PS_ALGORITHM_H_INCLUDED#include <iostream>
#include <string>
#include "cv.h"
#include "highgui.h"
#include "cxmat.hpp"
#include "cxcore.hpp"using namespace std;
using namespace cv;void Show_Image(Mat&, const string &);#endif // PS_ALGORITHM_H_INCLUDED#include "PS_Algorithm.h"void Dark_Channel(Mat& src, Mat& dst, int Block_size);
double Atmosperic_Light(Mat& J_dark, Mat& Img);
void Recove_Img(Mat& src, Mat& dst, Mat& T, float Th, float A);int main(void)
{Mat Img;Img=imread("5.jpg");Mat D_Img(Img.size(), CV_32FC3);Img.convertTo(D_Img, CV_32FC3);Mat Dark_Img(D_Img.size(), CV_32FC1);imshow("Img", Img);int Block_size=3;Dark_Channel(D_Img, Dark_Img, Block_size);float A=0;A=Atmosperic_Light(Dark_Img, D_Img);float W=0.9;Mat T(D_Img.size(), CV_32FC1);T=1-W/A*Dark_Img;//imshow("Img", T);float Th=0.35;Mat Img_out(D_Img.size(), CV_32FC3);Recove_Img(D_Img, Img_out, T, Th, A);Img_out/=255;imshow("Out",Img_out);waitKey();cvDestroyAllWindows();cout<<"All is well."<<endl;
}void Dark_Channel(Mat& src, Mat& dst, int Block_size)
{Mat R(src.size(), CV_32FC1);Mat G(src.size(), CV_32FC1);Mat B(src.size(), CV_32FC1);Mat m_array[]={R,G,B};cv::split(src, m_array);int t=0;t=(Block_size-1)/2;Mat a1(Block_size, Block_size, CV_32FC1);Mat a2(Block_size, Block_size, CV_32FC1);Mat a3(Block_size, Block_size, CV_32FC1);double min_a1=0;double min_a2=0;double min_a3=0;double min_value=0;for(int i=t; i<dst.rows-t; i++){for(int j=t; j<dst.cols-t; j++){a1=R(Range(i-t,i+t+1), Range(j-t,j+t+1));a2=G(Range(i-t,i+t+1), Range(j-t,j+t+1));a3=B(Range(i-t,i+t+1), Range(j-t,j+t+1));cv::minMaxLoc(a1, &min_a1,NULL,NULL,NULL);cv::minMaxLoc(a2, &min_a2,NULL,NULL,NULL);cv::minMaxLoc(a3, &min_a3,NULL,NULL,NULL);min_value=min(min_a1, min_a2);min_value=min(min_a3, min_value);dst.at<float>(i,j)=(float)min_value;}}dst(Range(0,t), Range::all())=dst(Range(t,2*t), Range::all());dst(Range(dst.rows-t,dst.rows), Range::all())=dst(Range(dst.rows-(2*t),dst.rows-t), Range::all());dst(Range::all(), Range(0,t))=dst(Range::all(),Range(t,2*t));dst(Range::all(),Range(dst.cols-t,dst.cols))=dst(Range::all(), Range(dst.cols-2*t,dst.cols-t));}double Atmosperic_Light(Mat& J_dark, Mat& Img)
{Mat M1(J_dark.size(), CV_32FC1);M1=J_dark;M1.reshape(0,1);Mat M2(1,J_dark.rows*J_dark.cols, CV_32FC1);cv::sort(M1,M2,CV_SORT_ASCENDING);int Index=J_dark.rows*J_dark.cols*0.9999;float T_value=M2.at<float>(0, Index);float value=0;float Temp_value;float r_temp, g_temp, b_temp;for(int i=0; i<Img.rows; i++){for(int j=0; j<Img.cols; j++){Temp_value=J_dark.at<float>(i,j);if(Temp_value>T_value){r_temp=Img.at<Vec3f>(i,j)[0];g_temp=Img.at<Vec3f>(i,j)[1];b_temp=Img.at<Vec3f>(i,j)[2];Temp_value=(r_temp+g_temp+b_temp)/3.0;value=max(value, Temp_value);}}}return value;
}void Recove_Img(Mat& src, Mat& dst, Mat& T, float Th, float A)
{float value=0;for(int i=0; i<src.rows; i++){for(int j=0; j<src.cols; j++){value=max(Th, T.at<float>(i,j));dst.at<Vec3f>(i,j)[0]=(src.at<Vec3f>(i,j)[0]-A)/value+A;dst.at<Vec3f>(i,j)[1]=(src.at<Vec3f>(i,j)[1]-A)/value+A;dst.at<Vec3f>(i,j)[2]=(src.at<Vec3f>(i,j)[2]-A)/value+A;}}}
原图
效果图

OpenCV——去雾相关推荐

  1. c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十五 |一种基于亮度均衡的图像阈值分割技术...

    前言 对于光照不均匀的图像,用通常的图像分割方法不能取得满意的效果.为了解决这个问题,论文<一种基于亮度均衡的图像阈值分割技术>提出了一种实用而简便的图像分割方法.该方法针对图像中不同亮度 ...

  2. c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十三 | 利用多尺度融合提升图像细节...

    前言 今天为大家介绍一个利用多尺度来提升图像细节的算法.这个算法来自于论文<DARK IMAGE ENHANCEMENT BASED ON PAIRWISE TARGET CONTRAST AN ...

  3. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

  4. 基于guided image filtering的图像去雾 opencv实现

    基于guided image filtering的图像去雾 与暗原色图像去雾模型是一个系列的. 暗原色图像去雾模型是cvpr2009 bestpaper,图像去雾效果很好. 即.Kaiming He, ...

  5. OpenCV图像处理专栏十七 | 清华大学《基于单幅图像的快速去雾》C++复现(有一定工程意义)

    代码开源在 https://github.com/BBuf/Image-processing-algorithm,感兴趣给我来个星星呗. 1. 前言 这是OpenCV图像处理算法朴素实现专栏的第17篇 ...

  6. opencv 图像雾检测_专栏 | OpenCV图像处理专栏十 | 利用中值滤波进行去雾

    原标题:专栏 | OpenCV图像处理专栏十 | 利用中值滤波进行去雾 前言 这是OpenCV图像处理专栏的第十篇文章,介绍一种利用中值滤波来实现去雾的算法.这个方法发表于国内的一篇论文,链接我放附录 ...

  7. opencv实现视频实时去雾算法

    现在一系列的文章,有不少算法都于去雾有关,比如限制对比度自适应直方图均衡化算法原理.实现及效果.局部自适应自动色阶/对比度算法在图像增强上的应用这两个增强算法都有一定的去雾能力,而最直接的就是< ...

  8. 机器学习实践系列之13 - OpenCV之图像去雾

    图像去雾 是图像质量保证的一个重要方面,这里要讲到的是这个领域的一个里程碑式的贡献: 来自 何凯铭 的基于 暗原色先验(dark channel prior)的单一输入图像去雾方法,这是一种简单但是有 ...

  9. C++OpenCV实战——车牌去雾、车牌检测、分割

    最近接了一个单子,具体任务是首先进行去雾操作,然后进行车牌的检测和分割,话不多说具体的代码如下所示:. myFun.h文件 #pragma once #ifndef FUNCTION_H #defin ...

最新文章

  1. 【实用总结】DOM节点className操作
  2. 南通市交巡警支队同城异地容灾备份系统项目中标结果公告
  3. weblogic12c 设置jvm大小_weblogic 12c 配置jvm的内存大小
  4. SpringCloud微服务权限控制(一)概述
  5. 使用Visual Studio比较两个数据库、查找差异和更新
  6. 项目管理学习总结(6)——产品经理常用的工具有哪些?
  7. Go 语言“助力”恶意软件?仅 4 年基于 Go 的恶意软件数就激增 2000%!
  8. 华为手机解锁码计算工具_华为手机强制解锁工具
  9. 【读过的书】《从你的全世界路过》
  10. 一只视频程序猿的移动直播SDK初体验
  11. github提交代码出现remote: Support for password authentication was removed on August 13, 2021.?
  12. form 表单提交后,使页面不跳转
  13. Vue背景图片去白边
  14. angular.js使用路由时,子控制器监听不到父级$boardcast的事件
  15. Android开发 Studio4.0 APP logo 适配
  16. 新磁盘分区格式化挂载
  17. 微信小程序wx.getImageInfo()获取图片信息
  18. Java doc转docx
  19. Smalltalk的变量
  20. Java、JSP外卖订餐系统

热门文章

  1. linux RAID管理与恢复误删除文件
  2. CSV格式转换为xlsx格式
  3. 后端框架之Flask--初识
  4. windows上配置本地深度学习工作站
  5. Vue_01_组件的使用
  6. Oracle和MySQL的数据类型
  7. GPIO的寄存器BSRR和BRR使用摘抄汇总
  8. 安装Ubuntu20.04后我做的那些事:插件,美化
  9. 将阿拉伯数字转换成中文大写金额的形式
  10. 登陆时做下双因子验证