方法一、
方法本身就是错的,是篇水论文。
方法二、
效果不好,整体偏红![FM83KIPCS~NKKO78G]$M)E5.jpg](/uploads/projects/zhinengche@pbd7w6/fa0ce93045daf8e1ff56ce8490d6b8ab.jpeg)

方法三、
实现出来效果不好

四、
最后选择了这种方法:



采用的是先色彩修正再去雾的方法。

代码先放一部分:
//先增强再去雾Image_Enhance(image, image);Color_Correction(image, testimage, 2);HazeRemoval(testimage, finalimage);imshow("补偿后的图", image);imshow("去雾后的图", finalimage);imshow("增强后的图", testimage);
全部代码:
HazeRemoval见上一篇博客。
/***************************************************************FunctionName: Color_CorrectionPurpose: 白平衡图像矫正Parameter: src 输入图像dst 输出图像method:1 绿通道为12 灰度世界算法Return: 无****************************************************************/void Color_Correction(Mat& src,Mat & dst,int method){vector<Mat> bgrChannels;split(src, bgrChannels);double B_mean, G_mean, R_mean;double B_std, G_std, R_std;double B_gain, G_gain, R_gain;Mat mean, stdDev;meanStdDev(src, mean, stdDev);B_mean = mean.at<double>(0, 0);G_mean = mean.at<double>(1, 0);R_mean = mean.at<double>(2, 0);B_std = stdDev.at<double>(0, 0);G_std = stdDev.at<double>(1, 0);R_std = stdDev.at<double>(2, 0);//计算增益方法switch (method){case 1://算法1 AWBB_gain = G_mean / B_mean;G_gain = 1;R_gain = G_mean / R_mean;break;case 2://算法2:灰度世界算法B_gain = (R_mean + G_mean + B_mean) / (3 * B_mean);G_gain = (R_mean + G_mean + B_mean) / (3 * G_mean);R_gain = (R_mean + G_mean + B_mean) / (3 * R_mean);break;}bgrChannels[0] *= B_gain;bgrChannels[1] *= G_gain;bgrChannels[2] *= R_gain;//归一化double bgrmin[3], bgrmax[3];for (size_t i = 0; i < 3; i++){minMaxLoc(bgrChannels[i], &bgrmin[i], &bgrmax[i]);bgrChannels[i] = (bgrChannels[i] - bgrmin[i]) / (bgrmax[i] - bgrmin[i]);}merge(bgrChannels, dst);}
/***************************************************************FunctionName: Image_EnhancePurpose: 色彩补偿 水下改进的UWB算法Parameter: src 输入图像dst 输出图像Return: 无****************************************************************/void Image_Enhance(Mat& src, Mat& dst){Mat fsrc;src.convertTo(fsrc, CV_32FC3, 1.0 / 255, 0);//图片像素归一化vector<Mat> bgrChannels;split(fsrc, bgrChannels);Mat Ib(bgrChannels[0]);Mat Ig(bgrChannels[1]);Mat Ir(bgrChannels[2]);double Ib_mean = mean(Ib)[0];double Ig_mean = mean(Ig)[0];double Ir_mean = mean(Ir)[0];Mat Irc = Ir + (Ir_mean / Ib_mean) * (Ib_mean - Ir_mean) * (Ib / Ir).mul((1 - Ir).mul(Ib));Mat Igc = Ig + (Ig_mean / Ib_mean) * (Ib_mean - Ir_mean) * (Ib / Ig).mul((1 - Ig).mul(Ib));Irc.copyTo(bgrChannels[2]);Igc.copyTo(bgrChannels[1]);merge(bgrChannels, dst);}
效果展示如下:

参考文献:
基于暗原色先验模型的水下彩色图像增强算法_曹美.pdf基于色彩校正与暗通道先验算法的水下图像增强方法_陈浩.pdf水下图像增强和修复算法综述_魏郭依哲.pdfAkkaynak_Sea-Thru_A_Method_for_Removing_Water_From_Underwater_Images_CVPR_2019_paper.pdfSingle_Image_Haze_Removal_Using_Dark_Channel_Prior.pdf
