OpenCV——去雾
这是一个简化的实现算法,完整的算法请参考:
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——去雾的更多相关文章
- OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾
论文下载地址:http://research.microsoft.com/en-us/um/people/jiansun/papers/GuidedFilter_ECCV10.pdf 本文主要介绍导向 ...
- 基于暗通道优先算法的去雾应用(Matlab/C++)
基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理: 参见论文:Single Image Haze Removal Using Dark Channel Pri ...
- 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)
最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...
- paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他
在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...
- paper 100:何恺明经典去雾算法
一:由简至美的最佳论文(作者:何恺明 视觉计算组) [视觉机器人:个人感觉学习他的经典算法固然很重要,但是他的解决问题的思路也是非常值得我们学习的] 那是2009年4月24日的早上,我收到了一封不同 ...
- 基于clahe的图像去雾
基于clahe的图像去雾 通过阅读一些资料,我了解到clahe算法对图像去雾有所价值,正好opencv中有了实现,拿过来看一看. 但是现在实现的效果还是有所差异 #); clahe] ...
- Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用
很多人都认为retinex和暗通道去雾是八杆子都打不着的增强算法.的确,二者的理论.计算方法都完全迥异,本人直接从二者的公式入手来简单说明一下,有些部分全凭臆想,不对之处大家一起讨论. 首先,为描述方 ...
- 暗通道去雾算法的python实现
何凯明博士的去雾文章和算法实现已经漫天飞了,我今天也就不啰里啰唆,直接给出自己python实现的完整版本,全部才60多行代码,简单易懂,并有简要注释,去雾效果也很不错. 在这个python版本中,计算 ...
- 一种可实时处理 O(1)复杂度图像去雾算法的实现。
在我博文的一系列的文章,有不少算法都于去雾有关,比如限制对比度自适应直方图均衡化算法原理.实现及效果.局部自适应自动色阶/对比度算法在图像增强上的应用这两个增强算法都有一定的去雾能力,而最直接的就是& ...
随机推荐
- JAVA面向对象-----构造方法
我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的.那么我们在java里面怎么在对象一旦创建就赋值呢? 构造方法作用 构造方法作用:对对象进行初始化. 构造函数与普通的函 ...
- javascript之页面打印
WebBrowser组件是IE内置的浏览器控件,使用时,首先要在<body>标签的下面用<object>...</object>标记声明WebBrowser组件,代 ...
- tomcat中Servlet的工作机制
在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法 ...
- 剑指Offer——网易笔试之不要二——欧式距离的典型应用
剑指Offer--网易笔试之不要二--欧式距离的典型应用 前言 欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的 ...
- Spark技术内幕:Worker源码与架构解析
首先通过一张Spark的架构图来了解Worker在Spark中的作用和地位: Worker所起的作用有以下几个: 1. 接受Master的指令,启动或者杀掉Executor 2. 接受Master的指 ...
- 02Framelayout:帧布局
Framelayout:帧布局 >概念:每个组件都是一帧 当前子组件会覆盖前一个组件 >属性: android:layout_gravity=&quo ...
- Tom DeMarco:软件工程这个概念已过时?
原文作者:Tom Demarco,写于2009年7月 作者简介:Tom DeMarco是大西洋系统协会(www.atlsysguild.com)的负责人.他的职业生涯开始于贝尔实验室,是结构化分析和设 ...
- iOS数据解析UI_14
数据解析:就是按照约定(假象)好的格式提取数据的过程就叫解析: 提供数据方(后台):工作就是把数据按照一定的格式存储起来 提取数据方(前台):工作就是把数据按照一定的格式读取出来 主流的格式:X ...
- Linux多线程实践(8) --Posix条件变量解决生产者消费者问题
Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...
- 【leetcode79】Single Number III
题目描述: 给定一个数组,里面只有两个数组,只是出现一次,其余的数字都是出现两次,找出这个两个数字,数组形式输出 原文描述: Given an array of numbers nums, in wh ...