方法一、
    方法本身就是错的,是篇水论文。
    image.png

    方法二、
    效果不好,整体偏红
    FM83KIPCS~NKKO78G]$M)E5.jpg
    image.png

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

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

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

    image.png
    代码先放一部分:

    1. //先增强再去雾
    2. Image_Enhance(image, image);
    3. Color_Correction(image, testimage, 2);
    4. HazeRemoval(testimage, finalimage);
    5. imshow("补偿后的图", image);
    6. imshow("去雾后的图", finalimage);
    7. imshow("增强后的图", testimage);

    全部代码:
    HazeRemoval见上一篇博客。

    1. /***************************************************************
    2. FunctionName: Color_Correction
    3. Purpose: 白平衡图像矫正
    4. Parameter: src 输入图像
    5. dst 输出图像
    6. method:
    7. 1 绿通道为1
    8. 2 灰度世界算法
    9. Return: 无
    10. ****************************************************************/
    11. void Color_Correction(Mat& src,Mat & dst,int method)
    12. {
    13. vector<Mat> bgrChannels;
    14. split(src, bgrChannels);
    15. double B_mean, G_mean, R_mean;
    16. double B_std, G_std, R_std;
    17. double B_gain, G_gain, R_gain;
    18. Mat mean, stdDev;
    19. meanStdDev(src, mean, stdDev);
    20. B_mean = mean.at<double>(0, 0);
    21. G_mean = mean.at<double>(1, 0);
    22. R_mean = mean.at<double>(2, 0);
    23. B_std = stdDev.at<double>(0, 0);
    24. G_std = stdDev.at<double>(1, 0);
    25. R_std = stdDev.at<double>(2, 0);
    26. //计算增益方法
    27. switch (method)
    28. {
    29. case 1://算法1 AWB
    30. B_gain = G_mean / B_mean;
    31. G_gain = 1;
    32. R_gain = G_mean / R_mean;
    33. break;
    34. case 2://算法2:灰度世界算法
    35. B_gain = (R_mean + G_mean + B_mean) / (3 * B_mean);
    36. G_gain = (R_mean + G_mean + B_mean) / (3 * G_mean);
    37. R_gain = (R_mean + G_mean + B_mean) / (3 * R_mean);
    38. break;
    39. }
    40. bgrChannels[0] *= B_gain;
    41. bgrChannels[1] *= G_gain;
    42. bgrChannels[2] *= R_gain;
    43. //归一化
    44. double bgrmin[3], bgrmax[3];
    45. for (size_t i = 0; i < 3; i++)
    46. {
    47. minMaxLoc(bgrChannels[i], &bgrmin[i], &bgrmax[i]);
    48. bgrChannels[i] = (bgrChannels[i] - bgrmin[i]) / (bgrmax[i] - bgrmin[i]);
    49. }
    50. merge(bgrChannels, dst);
    51. }
    1. /***************************************************************
    2. FunctionName: Image_Enhance
    3. Purpose: 色彩补偿 水下改进的UWB算法
    4. Parameter: src 输入图像
    5. dst 输出图像
    6. Return: 无
    7. ****************************************************************/
    8. void Image_Enhance(Mat& src, Mat& dst)
    9. {
    10. Mat fsrc;
    11. src.convertTo(fsrc, CV_32FC3, 1.0 / 255, 0);//图片像素归一化
    12. vector<Mat> bgrChannels;
    13. split(fsrc, bgrChannels);
    14. Mat Ib(bgrChannels[0]);
    15. Mat Ig(bgrChannels[1]);
    16. Mat Ir(bgrChannels[2]);
    17. double Ib_mean = mean(Ib)[0];
    18. double Ig_mean = mean(Ig)[0];
    19. double Ir_mean = mean(Ir)[0];
    20. Mat Irc = Ir + (Ir_mean / Ib_mean) * (Ib_mean - Ir_mean) * (Ib / Ir).mul((1 - Ir).mul(Ib));
    21. Mat Igc = Ig + (Ig_mean / Ib_mean) * (Ib_mean - Ir_mean) * (Ib / Ig).mul((1 - Ig).mul(Ib));
    22. Irc.copyTo(bgrChannels[2]);
    23. Igc.copyTo(bgrChannels[1]);
    24. merge(bgrChannels, dst);
    25. }

    效果展示如下:
    image.png
    image.png

    参考文献:
    基于暗原色先验模型的水下彩色图像增强算法_曹美.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