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)复杂度图像去雾算法的实现。
在我博文的一系列的文章,有不少算法都于去雾有关,比如限制对比度自适应直方图均衡化算法原理.实现及效果.局部自适应自动色阶/对比度算法在图像增强上的应用这两个增强算法都有一定的去雾能力,而最直接的就是& ...
随机推荐
- 【酷我天气】完整的天气App项目
本人完全自主设计与开发的一款轻量级简约好用的天气App,无广告,无烦人的通知栏信息,定位精准,天气信息数据准确,还支持更换背景皮肤哦,颜值爆表. 实现的功能: 1自动定位:自动获取用户所在的城市位置然 ...
- 浅谈hibernate+入门实例
Hibernate是对jdbc进一步的封装,随着项目的开展,小编开始接触到这个概念,一开始接触的时候并没有觉得hibernate有多神秘,没有进一步的研究,只是简单的知道她是对jdbc的进一步的封装, ...
- Android之EditText imeOptions属性解析
在我们的手机中,虽然通常输入法软键盘右下角会是回车按键,但我们经常会看到点击不同的编辑框,输入法软键盘右下角会有不同的图标.例如: 点击浏览器网址栏的时候,输入法软键盘右下角会变成"GO& ...
- Android开发学习之路--图表实现(achartengine/MPAndroidChart)之初体验
已经有一段时间没有更新博客了,在上周离开工作了4年的公司,从此不再安安稳稳地工作了,更多的是接受挑战和实现自身价值的提高.离开了嵌入式linux,从此拥抱移动互联网,也许有点为时已晚,但是相信通过 ...
- Fragment的事务操作&Actvity的状态丢失
Fragment Transactions & Activity State Loss 本文翻译自Fragment Transactions & Activity State Loss ...
- ASP.net 路径问题 详解
各位有没有碰到在日常工作中经常在路径设置的时候把 "~/ ../ .../ . / .http://www.cnblogs.com/"这些符号搞混搞乱了?偶尔还会因路径的问题郁闷了 ...
- linux内核cfs浅析
linux调度器的一般原理请参阅<linux进程调度浅析>.之前的调度器cfs之前的linux调度器一般使用用户设定的静态优先级,加上对于进程交互性的判断来生成动态优先级,再根据动态优先级 ...
- Oracle EBS SLA 详解
SLA概述 SLA :子分类账(Subledger Accounting),这个在R12中大力宣扬的内容,我们通常的认为总账就是对Journal的汇总,但是在实际的操作中我们会发现,对于Sub sys ...
- Android动画深入分析
动画分类 Android动画可以分3种:View动画,帧动画和属性动画:属性动画为API11的新特性,在低版本是无法直接使用属性动画的,但可以用nineoldAndroids来实现(但是本质还是vii ...
- ASP.NET实现网页版小优盘
今天看到了一篇不错的文章,就拿来一起分享一下吧. 实现的是文件的上传与下载功能. 关于文件上传: 谈及文件上传到网站上,首先我们想到的就是通过什么上传呢?在ASP.NET中,只需要用FileUploa ...