openCV关于暗原色方法去雾的源程序
基于暗原色先验的图像去雾算法研究的开题报告

基于暗原色先验的图像去雾算法研究的开题报告一、研究背景及意义近年来,图像去雾是计算机视觉领域中备受关注的研究方向之一。
由于许多自然场景中存在着雾、烟雾等气溶胶,这些气溶胶对于图像质量和可视性的影响巨大。
因此,如何去除这些噪音并恢复清晰的图像,对于提高图像的质量和可视性具有重要意义。
图像去雾算法的研究和应用在计算机视觉、计算机图形学、遥感图像处理等领域广泛应用。
目前,已经有许多图像去雾算法被提出,如单尺度Retinex、Dark Channel Prior、全自动物理模型、分层反卷积等。
但是,在实际应用中,这些算法仍然存在以下几个问题:去雾效果不理想、存在较大的计算复杂度和较大的计算误差等问题。
因此,如何提出一种高效、准确、实用的图像去雾算法,是当前研究的重点。
二、研究目标和内容本文的研究目标是基于暗原色先验的图像去雾算法的研究,旨在解决现有算法的不足,提高去雾算法的准确性和效率。
具体研究内容包括:1. 基于暗原色的理论研究:分析暗原色与气溶胶之间的物理关系,研究暗原色先验在图像去雾中的作用和作用机理。
2. 基于暗原色先验的图像去雾算法设计:基于暗原色先验,设计一种新型的去雾算法,包括暗通道先验、暗原色先验和模糊先验等关键步骤。
3. 算法实现与优化:设计并实现基于暗原色先验的去雾算法,利用图像处理的相关技术对算法进行优化和改进,降低算法的时间复杂度和计算误差。
4. 算法评价:选取不同的数据集和评价指标,对所提出的算法进行定量和定性评价。
与现有的各种算法进行对比分析,检验本文算法的可行性和效果。
三、预期研究成果1. 基于暗原色先验的图像去雾算法:提出一种全新的图像去雾算法,以暗原色先验为主要思想,采用暗通道先验、模糊先验等关键步骤实现图像去雾。
2. 算法的优化和改进:利用图像处理技术和优化算法,降低算法的复杂度和误差,提高算法的运行速度和准确性。
3. 算法的应用分析:对算法的实际应用进行分析,如在图像处理、计算机视觉、计算机图形学等领域的应用。
opencv去雾函数

opencv去雾函数OpenCV是一个开源的计算机视觉库,提供了一些强大的函数和工具,用于处理图像和视频。
在处理图像时,有时我们会遇到一些困扰,比如图像中存在雾霾。
为了解决这个问题,OpenCV提供了一些去雾的函数和算法。
在OpenCV中,去雾通常使用透射模型来实现。
透射模型假设图像中的像素受到雾霾的影响,从而降低了其亮度和对比度。
因此,我们可以通过估计透射率来还原图像的原始亮度和对比度,从而去除雾霾。
首先,我们需要估计透射率。
OpenCV提供了一些方法来实现这个目标,比如暗通道先验法和颜色恢复法。
暗通道先验法在去雾中广泛使用,并且在OpenCV中也有相应的函数。
该方法基于一个观察结果:在大多数户外自然图像中,至少有一些像素具有非常低的强度。
这些像素通常不受雾霾的影响,被称为暗通道。
通过计算图像的暗通道,我们可以估计出透射率。
具体而言,我们需要找到暗通道中最暗的像素,并计算其亮度值。
然后,通过将该值除以255来获得透射率。
除了暗通道先验法,颜色恢复法也是一种常见的去雾方法。
这种方法基于一个假设:在户外自然图像中,远处的物体会受到雾霾的影响,其颜色会变得较浅。
因此,我们可以通过比较远处物体和近处物体的颜色差异来估计透射率。
具体而言,我们需要计算带有雾霾的图像和去雾图像之间的颜色差异,并将其除以255来获得透射率。
一旦我们估计出了透射率,我们就可以使用它来去除图像中的雾霾。
在OpenCV中,有一些函数可以帮助我们实现这一目标,比如cv::dehaze(和cv::inpaint(。
cv::dehaze(函数是一个高级函数,它可以从图像中去除雾霾。
该函数需要估计透射率的方法作为参数,并返回去雾后的图像。
具体而言,我们可以使用暗通道先验法或颜色恢复法来估计透射率,并将其作为参数传递给cv::dehaze(函数。
该函数将返回去雾后的图像。
除了cv::dehaze(函数,我们还可以使用cv::inpaint(函数来去除图像中的雾霾。
基于暗原色先验的单幅图像去雾方法的优化技术

基于暗原色先验的单幅图像去雾方法的优化技术周首峰;耿楠【摘要】暗原色先验技术在处理单幅图像去雾方面取得了较好的效果,但其处理高分辨率图像时,需要消耗大量的计算资源与时间,效率较低.针对这一问题,提出利用高斯滤波代替软抠图方法去除计算过程中的块状效应,平滑透射率,并根据平滑后的透射率恢复无雾图像.实验结果表明优化后的方法显著地减少计算量,所需时间仅为原方法的1/20左右,且能够得到与原方法基本一致的去雾结果.【期刊名称】《计算机应用与软件》【年(卷),期】2013(030)007【总页数】3页(P287-289)【关键词】去雾;单幅图像;透射率;高斯滤波【作者】周首峰;耿楠【作者单位】西北农林科技大学信息工程学院陕西杨凌712100;西北农林科技大学信息工程学院陕西杨凌712100【正文语种】中文【中图分类】TP3910 引言户外景物的图像通常会因为大气中混浊的媒介(比如雾、霭、蒸气等)而降质,这是由于光线被大气吸收或光线散射造成的。
这使得图像的对比度和颜色的保真度都会有所下降,产生雾化效果。
因此,对含雾图像进行清晰化处理具有重要意义。
近年来,针对单幅图像去雾的研究取得了重大的突破。
Tan[1]通过最大化局部的差异度的方法来恢复图像的对比度,在处理特定图像上取得了较好的效果,但该方法的缺点是复原后的图像颜色会发生过饱和。
Fattal[2]提出了部分符合物理规律的简单去雾模型,利用复杂的优化计算得到去雾结果,然而该方法处理浓雾图像失真较大。
He等人[3]提出了暗原色先验的方法,并利用该方法取得了很好的去雾效果,从而成为目前比较有效的图像去雾方法。
基于暗原色先验的方法在图像去雾方面取得了重大的突破,但是在实际应用中存在计算量大的问题,其效率较低,从而限制了其应用与推广。
本文针对这一问题,对基于暗原色先验的图像去雾算法进行改进,减少了图像去雾的计算量,提高了处理效率。
1 雾图形成的物理模型在计算机视觉和计算机图形领域,雾图形成模型广泛采用如下公式[1,2,4,5]:式中:x是表示像素点坐标,I指像素颜色强度,J表示景物光线强度,A是大气光成分,t用于描述光线通过媒介透射到相机过程中未被散射的部分,方程右边的第一项J(x)t(x)叫做直接衰减项[1],第二项A(1-t(x))则是大气光成分。
暗通道去雾算法的c++实现

暗通道去雾算法的c++实现摘要:1.暗通道去雾算法概述2.暗通道去雾算法的C++实现3.C++实现的优点与局限性4.未来发展趋势正文:一、暗通道去雾算法概述暗通道去雾算法是一种基于图像暗通道优先的图像去雾方法,该算法由何凯明博士提出,并在2009 年CVPR(计算机视觉和模式识别国际会议)上获得最佳论文奖。
该算法主要针对图像中的雾天效应,通过统计分析大量户外自然景物图片,发现晴空图像的非天空部分的局部区域内,存在一些像素至少一个颜色通道具有很低的值,该区域内各个通道的最小值接近零。
利用这一规律,可以有效地去除图像中的雾气,提高图像质量。
二、暗通道去雾算法的C++实现暗通道去雾算法的C++实现主要包括以下几个步骤:1.读取图像并转换为灰度图像2.对灰度图像进行最小值滤波,得到暗通道图像3.计算暗通道图像的透率4.根据透率恢复原始图像三、C++实现的优点与局限性C++实现的优点:1.代码结构清晰,易于理解2.利用C++的性能优势,计算速度较快3.可以方便地与其他图像处理库(如OpenCV)结合使用局限性:1.实现过程中需要处理大量图像数据,计算量较大2.如果处理大型图像,可能会导致内存不足3.算法本身具有一定的局限性,可能不适用于所有类型的雾天图像四、未来发展趋势随着深度学习和人工智能技术的发展,图像去雾算法在未来将取得更大的突破。
例如,可以尝试将深度学习技术应用于去雾算法,提高去雾效果;另外,也可以研究更加智能的算法,使其能够自动适应不同的雾天图像,提高去雾效果。
综上所述,暗通道去雾算法的C++实现具有一定的优点,但仍存在一些局限性。
暗通道去雾算法的流程

暗通道去雾算法的流程
1)计算暗通道:首先计算图像的暗通道,暗通道从多个颜色通道中取最小值,该值代表了特定像素的整体暗度,像素点越暗,对应的暗通道值越小。
2)计算暗通道图:将所有像素点的暗通道值组合成暗通道图,用来表示各个像素的暗度。
3)计算暗通道掩模:根据暗通道图中的暗度,计算暗通道掩模,掩模像素值越大,表示图像越暗。
4)去除雾气:利用暗通道掩模去除雾气,可以得到去雾后的图像。
5)视差法补偿缺失:由于去雾后的图像中可能会存在部分信息缺失的情况,可以使用视差法补偿缺失的信息,使图像更加清晰。
以上就是暗通道去雾算法的基本处理流程,它是一种非常高效、快速的去雾技术,可以大大减少图像处理的时间,提高处理效率。
暗通道去雾算法相比传统去雾技术,无论是从处理速度还是处理质量来说,都具有明显的优势。
-暗原色去雾霾处理c

北京航空航天大学数字图像处理–课程设计报告图像去雾霾111515班(11151201)2014.6.271.实现目标1、算法功能雾霾是特定气候条件与人类活动相互作用的结果。
高密度人口的经济及社会活动必然会排放大量细颗粒物,一旦排放超过大气循环能力和承载度,细颗粒物浓度将持续积聚,此时如果受静稳天气等影响,极易出现大范围雾霾。
2、技术指标去雾霾方式是推测每一个像素点的雾霾浓度,将其去除。
现实中给我们的印象是,在雾霾天气下,近距离的物体看得比较清,雾霾的浓度小;远距离的物体看不清,雾霾的浓度大。
可以说,雾霾图像=清晰图像+雾霾浓度。
因此,为了准确恢复清晰图像,我们必须估计图像中物体所处位置的雾霾浓度,这是高性能去雾霾技术的关键所在。
2.研究现状分析1、国内外研究现状目前,国内外对于图像去雾的方法主要分为两大类,一类是基于大气退化物理模型的方法, 即从物理成因的角度对大气散射作用进行建模分析,进而得到场景深度模型,实现场景复原,另一类是基于图像增强的方法[,也就是单纯从图像的角度考虑,无须借助其他设备或者参考图像等辅助信息,直接利用图像增强方法改善图像质量,达到降低雾影响的目的。
2、目前存在的问题第一类方法一般需要复杂的建模过程,有些甚至还需要额外的特殊设备,或者需要无雾的图像作为参考,实现过程比较困难。
3、算法描述基于暗原色先验的单幅图像去雾算法(使用opencv)首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定,一般有WindowSize = 2 * Radius + 1; .根据雾图成型模型,求出A,t(x)带入求出J即可。
暗原色先验是通过对户外无雾图像的观察得出的:在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值。
换言之,该区域光强度的最小值是个很小的数。
公式描述:J = ( I - A)/t + A其中I(X)就是我们现在已经有的图像(待去雾的图像),J(x)是我们要恢复的无雾的图像,A是全球大气光成分,t(x)为透射率。
【转】暗通道去雾算法的python实现
【转】暗通道去雾算法的python实现原⽂链接:何凯明博⼠的去雾⽂章和算法实现已经漫天飞了,我今天也就不啰⾥啰唆,直接给出⾃⼰python实现的完整版本,全部才60多⾏代码,简单易懂,并有简要注释,去雾效果也很不错。
在这个python版本中,计算量最⼤的就是最⼩值滤波,纯python写的,慢,可以进⼀步使⽤C优化,其他部分都是使⽤numpy和opencv的现成东东,效率还⾏。
import cv2import numpy as npdef zmMinFilterGray(src, r=7):'''最⼩值滤波,r是滤波器半径''''''if r <= 0:return srch, w = src.shape[:2]I = srcres = np.minimum(I , I[[0]+range(h-1) , :])res = np.minimum(res, I[range(1,h)+[h-1], :])I = resres = np.minimum(I , I[:, [0]+range(w-1)])res = np.minimum(res, I[:, range(1,w)+[w-1]])return zmMinFilterGray(res, r-1)'''return cv2.erode(src, np.ones((2*r+1, 2*r+1))) #使⽤opencv的erode函数更⾼效def guidedfilter(I, p, r, eps):'''引导滤波,直接参考⽹上的matlab代码'''height, width = I.shapem_I = cv2.boxFilter(I, -1, (r,r))m_p = cv2.boxFilter(p, -1, (r,r))m_Ip = cv2.boxFilter(I*p, -1, (r,r))cov_Ip = m_Ip-m_I*m_pm_II = cv2.boxFilter(I*I, -1, (r,r))var_I = m_II-m_I*m_Ia = cov_Ip/(var_I+eps)b = m_p-a*m_Im_a = cv2.boxFilter(a, -1, (r,r))m_b = cv2.boxFilter(b, -1, (r,r))return m_a*I+m_bdef getV1(m, r, eps, w, maxV1): #输⼊rgb图像,值范围[0,1]'''计算⼤⽓遮罩图像V1和光照值A, V1 = 1-t/A'''V1 = np.min(m,2) #得到暗通道图像V1 = guidedfilter(V1, zmMinFilterGray(V1,7), r, eps) #使⽤引导滤波优化bins = 2000ht = np.histogram(V1, bins) #计算⼤⽓光照Ad = np.cumsum(ht[0])/float(V1.size)for lmax in range(bins-1, 0, -1):if d[lmax]<=0.999:breakA = np.mean(m,2)[V1>=ht[1][lmax]].max()V1 = np.minimum(V1*w, maxV1) #对值范围进⾏限制return V1,Adef deHaze(m, r=81, eps=0.001, w=0.95, maxV1=0.80, bGamma=False):Y = np.zeros(m.shape)V1,A = getV1(m, r, eps, w, maxV1) #得到遮罩图像和⼤⽓光照for k in range(3):Y[:,:,k] = (m[:,:,k]-V1)/(1-V1/A) #颜⾊校正Y = np.clip(Y, 0, 1)if bGamma:Y = Y**(np.log(0.5)/np.log(Y.mean())) #gamma校正,默认不进⾏该操作return Yif __name__ == '__main__':m = deHaze(cv2.imread('land.jpg')/255.0)*255cv2.imwrite('defog.jpg', m)下⾯给两个运⾏效果吧。
暗通道去雾算法的c++实现
暗通道去雾算法的c++实现以下是一个简单的暗通道去雾算法的C++实现:```cpp#include <iostream>#include <opencv2/opencv.hpp>using namespace cv;Mat darkChannel(Mat input, int patchSize) {Mat imgGray, dark;cvtColor(input, imgGray, CV_BGR2GRAY);// 创建dark通道的初始图像dark = Mat::zeros(input.rows, input.cols, CV_8UC1);int halfPatchSize = patchSize / 2;for (int i = halfPatchSize; i < input.rows - halfPatchSize; i++) { for (int j = halfPatchSize; j < input.cols - halfPatchSize; j++) {uchar minVal = 255;for (int m = -halfPatchSize; m <= halfPatchSize; m++) { for (int n = -halfPatchSize; n <= halfPatchSize; n++) { uchar val = imgGray.at<uchar>(i + m, j + n);if (val < minVal) {minVal = val;}}}dark.at<uchar>(i, j) = minVal;}}return dark;}Mat atmosphericLight(Mat input, Mat darkChannel, double percent) {int numPixels = input.rows * input.cols;int numSelectPixels = static_cast<int>(numPixels * percent);Mat imgGray;cvtColor(input, imgGray, CV_BGR2GRAY);// 创建暗通道排序索引Mat flatDark = darkChannel.reshape(0, numPixels);Mat sortedIdx;cv::sortIdx(flatDark, sortedIdx, CV_SORT_EVERY_COLUMN + CV_SORT_ASCENDING);// 选择前percent的像素作为大气光的估计Mat topPixels = sortedIdx.rowRange(numPixels - numSelectPixels - 1, numPixels - 1);topPixels = topPixels.reshape(1, numSelectPixels);std::vector<int> indices;for (int i = 0; i < numSelectPixels; i++) {int idx = topPixels.at<int>(i);indices.push_back(idx);}// 求取大气光估计Mat atmosLight(1, 1, CV_64FC1);atmosLight.at<double>(0) = 0;for (int i = 0; i < numSelectPixels; i++) {int idx = indices[i];int y = idx / input.cols;int x = idx % input.cols;uchar val = imgGray.at<uchar>(y, x);atmosLight.at<double>(0) += val;}atmosLight.at<double>(0) /= numSelectPixels;return atmosLight;}Mat dehaze(Mat input, Mat dark, Mat atmosLight, double t, double omega) {Mat result = Mat::zeros(input.rows, input.cols, CV_8UC1);for (int i = 0; i < input.rows; i++) {for (int j = 0; j < input.cols; j++) {double imgVal = static_cast<double>(input.at<uchar>(i, j)); double dcVal = static_cast<double>(dark.at<uchar>(i, j)); double trans = 1.0 - omega * dcVal /atmosLight.at<double>(0);trans = std::max(trans, t);double resultVal = (imgVal - atmosLight.at<double>(0)) / trans + atmosLight.at<double>(0);result.at<uchar>(i, j) = static_cast<uchar>(resultVal);}}return result;}int main() {std::string filename = "input.jpg";Mat input = imread(filename);int patchSize = 15;double percent = 0.001;double t = 0.1;double omega = 0.95;Mat dark = darkChannel(input, patchSize);Mat atmosLight = atmosphericLight(input, dark, percent);Mat result = dehaze(input, dark, atmosLight, t, omega);imshow("Input", input);imshow("Dehazed", result);waitKey(0);return 0;}```这段代码实现了基本的暗通道去雾算法。
基于暗原色先验的快速单幅图像去雾算法
基于暗原色先验的快速单幅图像去雾算法Wang Dianwei;Yan Weichao;Liu Ying;Zhu Tingge【期刊名称】《计算机应用研究》【年(卷),期】2018(035)012【摘要】针对基于暗原色先验理论的单幅图像去雾算法中,由于某些场景下的雾天图像存在大面积明亮区域(如天空、水面或偏白色物体等)不满足暗原色先验假设,从而导致去雾处理效果不好的问题,基于暗原色先验理论,提出了一种改进的单幅图像去雾算法.首先利用统计截断的方法估计出大气光值;然后对暗通道图进行中值滤波得到粗略估计的透射率图,并对明亮区域的透射率图进行自适应校正处理;最后将这些参数代入大气散射成像模型完成去雾处理.实验结果显示,相较于原算法而言,所提算法可以准确地选取出天空区域的像素点对大气光进行估计,有效降低了明亮区域的色彩失真.通过不同算法对不同室外场景下采集的雾天图像的去雾效果的对比可知,所提算法在对明亮区域的处理上更加合理,可以较好地处理一些带有光源的图像,恢复出的图像具有很好的细节保持,视觉效果显著提高.所提算法对含有大面积明亮区域的雾天图像具有很好的增强处理效果,可以为图像分割、语义检索、智能分析等图像处理工作提供有效的预处理手段,对于交通监管、视频监控、行车视频记录、视觉导航等研究领域具有重要的意义.【总页数】5页(P3836-3840)【作者】Wang Dianwei;Yan Weichao;Liu Ying;Zhu Tingge【作者单位】【正文语种】中文【中图分类】TP391.4;TP301.6【相关文献】1.基于暗原色先验与MTV模型的单幅彩色图像去雾 [J], 赵胜楠;魏伟波;潘振宽;李帅2.基于暗原色先验的单幅图像快速去雾算法 [J], 王雅婷;冯子亮3.基于暗原色先验的单幅图像去雾方法的优化技术 [J], 周首峰;耿楠4.基于暗原色先验的单幅图像去雾优化技术 [J], 刘健;张宾;鹿超;王燕燕;邸丽霞5.基于HSI颜色空间与暗原色先验原理的单幅图像去雾算法 [J], 衷佩玮; 杨睿; 孙恺琦; 陈国强因版权原因,仅展示原文概要,查看原文内容请购买。
基于暗原色先验的图像快速去雾
计算机应用与软件 ComputerApplicationsandSoftware
Vol37 No.2 Feb.2020
基于暗原色先验的图像快速去雾
林椹1 张 发2 李小平1 赵 强2
1(西安邮电大学理学院 陕西 西安 710121) 2(西安邮电大学通信与信息工程学院 陕西 西安 710121)
IMAGEFASTDEHAZING BASEDONDARK CHANNELPRIOR
LinZhenxian1 ZhangFa2 LiXiaoping1 ZhaoQiang2
1(CollegeofScience,Xi’anUniversityofPostsandTelecommunications,Xi’an710121,Shaanxi,China) 2(CollegeofTelecommunicationsandInformationEngineering,Xi’anUniversityofPostsand Telecommunications,Xi’an710121,Shaanxi,China)
法已经取得了较大进展[3]。文献[9]通过最大化局部 对比度来实现图像去雾,但去雾后的图像容易出现色 彩过饱和与 光 晕 效 应。 文 献 [10]通 过 统 计 雾 天 图 像 的颜色信息 实 现 去 雾,但 对 浓 雾 图 像 恢 复 效 果 较 差。 文献[11]利用中值滤波估计大气耗散函数,但在场景 边缘处容易 出 现 光 晕 效 应。 文 献 [12]通 过 观 察 无 雾 图像的统计特征,提出一种基于暗原色先验的图像去 雾算法。其通过暗原色先验得到初始透射率,然后使 用软抠图或者引导滤波[13]对初始粗透射率进行细化, 最后根据大气散射模型复原图像,但该算法对包含天 空或其他白色物体的图像处理结果较差,且恢复图像 较暗。文献[14]提出容差的概念,通过容差调整亮白 区域的透射率,但该算法需要根据不同图像手动调整 容差大小,自适应性较弱。文献[15]通过阈值分割划 分出天空区域和非天空区域并分别进行去雾,但图像 分割过程较为耗时,使该算法效率较低。文献[16]通 过透射率权值因子融合暗原色先验与图像增强使得恢 复的图像视觉效果较好,但天空区域较大时易出现颜 色失真,鲁棒性较弱。文献[17]采用场景深度模型和 插值法估计透射率,从而有效提高算法效率,但图像去 雾的质量提升较小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<iostream.h> #include<cv.h>#include<highgui.h>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的ROIIplImage *imgroi2;//dst2的ROIIplImage *imgroi3;//dst3的ROIIplImage *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->height),IPL_DEPTH_8U,1);//为各个ROI分配内存imgroi1=cvCreateImage(cvSize(block,block),IPL_DEPTH_8U,1);imgroi2=cvCreateImage(cvSize(block,block),IPL_DEPTH_8U,1);imgroi3=cvCreateImage(cvSize(block,block),IPL_DEPTH_8U,1);roidark=cvCreateImage(cvSize(block,block),IPL_DEPTH_8U,1);//为j1 j2 j3分配大小j1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);j2=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);j3=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);//为暗原色先验指针分配大小dark_channel=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1); //为透射率指针分配大小toushelv=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);//dst分配大小dst=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,3);//将原彩色图像分离成三通道cvSplit(src,dst1,dst2,dst3,NULL);//求暗原色ROI_rect.width=block;ROI_rect.height=block;ROI_rect.x=0;ROI_rect.y=0;int i;int j;double min1=0;double max1=0;double min2=0;double max2=0;double min3=0;double max3=0;double min=0;CvScalar value;for(i=0;i<src->width/block;i++){ for(j=0;j<src->height/block;j++){//分别计算三个通道内ROI的最小值cvSetImageROI(dst1,ROI_rect);cvCopy(dst1,imgroi1,NULL);cvMinMaxLoc(imgroi1,&min1,&max1,NULL,NULL); cvSetImageROI(dst2,ROI_rect);cvCopy(dst2,imgroi2,NULL);cvMinMaxLoc(imgroi2,&min2,&max2,NULL,NULL); cvSetImageROI(dst3,ROI_rect);cvCopy(dst3,imgroi3,NULL);cvMinMaxLoc(imgroi3,&min3,&max3,NULL,NULL); //求三个通道内最小值的最小值if(min1<min2)min=min1;elsemin=min2;if(min>min3)min=min3;//min为这个ROI中暗原色value=cvScalar(min,min,min,min);//min放在value中//min赋予dark_channel中相应的ROIcvSetImageROI(dark_channel,ROI_rect);cvSet(roidark,value,NULL);cvCopy(roidark,dark_channel,NULL);//释放各个ROIcvResetImageROI(dst1);cvResetImageROI(dst2);cvResetImageROI(dst3);cvResetImageROI(dark_channel);//转入下一个ROIROI_rect.x=block*i;ROI_rect.y=block*j;}}//保存暗原色先验的图像cvSaveImage("f:/dark_channel_prior.jpg",dark_channel);//利用得到的暗原色先验dark_channel_prior.jpg求大气光强double min_dark;double max_dark;CvPoint min_loc;CvPoint max_loc;//max_loc是暗原色先验最亮一小块的原坐标cvMinMaxLoc(dark_channel,&min_dark,&max_dark,&min_loc,&max_loc,N ULL);cout<<max_loc.x<<" "<<max_loc.y<<endl;ROI_rect.x=max_loc.x;ROI_rect.y=max_loc.y;double A_dst1;//定义大气光成分的估计值double dst1_min;double A_dst2;double dst2_min;double A_dst3;double dst3_min;cvSetImageROI(dst1,ROI_rect);//按照论文方法求大气光强估计值cvCopy(dst1,imgroi1,NULL);cvMinMaxLoc(imgroi1,&dst1_min,&A_dst1,NULL,NULL);cvSetImageROI(dst2,ROI_rect);cvCopy(dst2,imgroi2,NULL);cvMinMaxLoc(imgroi2,&dst2_min,&A_dst2,NULL,NULL);cvSetImageROI(dst3,ROI_rect);cvCopy(dst3,imgroi3,NULL);cvMinMaxLoc(imgroi3,&dst3_min,&A_dst3,NULL,NULL);cout<<A_dst1<<" "<<A_dst2<<" "<<A_dst3<<endl;//这三值为大气光强度估计值//求透射率int k;int l;CvScalar m;CvScalar n;//暗原色先验各元素值for(k=0;k<src->height;k++){for(l=0;l<src->width;l++){m=cvGet2D(dark_channel,k,l);n=cvScalar(255-w*m.val[0]);//w目的是保留一部分的雾,使图像看起来真实些cvSet2D(toushelv,k,l,n);}}cvSaveImage("f:/toushelv.jpg",toushelv);//求无雾图像int p,q;double tx;double jj1,jj2,jj3;CvScalar ix,jx;for(p=0;p<src->height;p++){for(q=0;q<src->width;q++){tx=cvGetReal2D(toushelv,p,q);tx=tx/255;if(tx<0.1)tx=0.1;ix=cvGet2D(src,p,q);jj1=(ix.val[0]-A_dst1)/tx+A_dst1;//根据雾产生模型运算,还原出无雾图像jj2=(ix.val[1]-A_dst2)/tx+A_dst2;jj3=(ix.val[2]-A_dst3)/tx+A_dst3;jx=cvScalar(jj1,jj2,jj3,0.0);cvSet2D(dst,p,q,jx);}}cvSaveImage("f:/removed_haze.jpg",dst);//释放指针cvReleaseImage(&dst1);cvReleaseImage(&dst2);cvReleaseImage(&dst3);cvReleaseImage(&imgroi1);cvReleaseImage(&imgroi2); cvReleaseImage(&imgroi3); cvReleaseImage(&roidark); cvReleaseImage(&dark_channel); cvReleaseImage(&toushelv); cvReleaseImage(&j1); cvReleaseImage(&j2); cvReleaseImage(&j3);return dst;}void on_trackbar1(int h){dst=quw(src,block,w);cvShowImage("目的图像",dst); // cvWaitKey(0);}void on_trackbar2(int h){w=(double)w1/100;dst=quw(src,block,w);cvShowImage("目的图像",dst);// cvWaitKey(0);}//主函数如下void main(){//打开图像src=cvLoadImage("8.jpg",-1);//创造窗口cvNamedWindow("有雾图像",CV_WINDOW_AUTOSIZE);cvShowImage("有雾图像",src);cvNamedWindow("目的图像",CV_WINDOW_AUTOSIZE);cvCreateTrackbar(tbarname1, "目的图像", &block, 15, on_trackbar1); cvCreateTrackbar(tbarname2, "目的图像", &w1, 100, on_trackbar2);cvWaitKey(0);cvReleaseImage(&src);cvReleaseImage(&dst);}。