方法一、
方法本身就是错的,是篇水论文。
方法二、
效果不好,整体偏红
方法三、
实现出来效果不好
四、
最后选择了这种方法:
采用的是先色彩修正再去雾的方法。
代码先放一部分:
//先增强再去雾
Image_Enhance(image, image);
Color_Correction(image, testimage, 2);
HazeRemoval(testimage, finalimage);
imshow("补偿后的图", image);
imshow("去雾后的图", finalimage);
imshow("增强后的图", testimage);
全部代码:
HazeRemoval见上一篇博客。
/***************************************************************
FunctionName: Color_Correction
Purpose: 白平衡图像矫正
Parameter: src 输入图像
dst 输出图像
method:
1 绿通道为1
2 灰度世界算法
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 AWB
B_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_Enhance
Purpose: 色彩补偿 水下改进的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