去雾算法工程化实现

     在计算机视觉领域,图像去雾一直是一个具有挑战性且极具工程化应用价值的研究课题。
雾气、烟尘等大气条件对图像质量的影响显著,导致图像对比度降低、色彩失真,严重影响了图像识别、目标检测等任务的性能。随着数字图像处理技术的发展,基于 OpenCV 的图像去雾算法应运而生,为解决这一问题提供了有效的工程化方案。本文将详细介绍一种基于暗通道先验理论的图像去雾算法,并通过 C++ 和 OpenCV 实现其工程化应用,探讨其在实际场景中的优势与局限。

一、暗通道先验理论基础

      暗通道先验理论是何凯明博士等人提出的一种用于描述无雾自然图像的统计特性。其核心思想是:在大多数无雾的自然图像中,至少存在一个颜色通道(红、绿、蓝中的一个),在局部区域内具有很低的亮度值,即暗通道。这一特性源于自然场景中物体表面的反射特性以及大气散射模型。当图像受到雾的影响时,由于雾气的散射作用,图像的暗通道会变得明亮,因此通过分析图像的暗通道,可以有效地估计出雾的浓度分布,进而实现去雾处理。

具体来说,暗通道先验理论基于大气散射模型,该模型将图像的形成过程描述为:

I(x)=J(x)t(x)+A(1 - t(x))

  • I\left ( x \right ) 是观测到的有雾图像;

  • J\left ( x \right ) 是无雾图像;

  • t\left ( x \right ) 是透射率,表示无雾图像 J\left ( x \right )通过雾气到达传感器的比例;

  • A是大气光,表示背景光的颜色和强度

  •  A(1 - t(x))则表示大气光的散射部分。通过暗通道先验理论,可以估计出透射率 t\left ( x \right ) 和大气光 A,从而恢复出无雾图像 J\left ( x \right )

二、应用场景

     在交通监控领域,图像去雾技术可以显著提高监控系统的有效性。雾气会影响车牌识别、车辆检测等任务的准确性,通过应用本文介绍的去雾算法,可以有效去除监控图像中的雾气,提高图像质量,从而提高车牌识别率和车辆检测的准确性。例如,在高速公路监控系统中,去雾后的图像可以更清晰地显示车辆的行驶状态和车牌信息,为交通管理和事故调查提供更可靠的数据支持。
     安防监控系统通常需要在各种环境条件下保持高清晰度的图像质量。雾气等恶劣天气条件会对安防监控图像产生严重影响,降低监控系统的可靠性。本文的去雾算法可以应用于安防监控系统中,实时去除监控图像中的雾气,确保监控图像的清晰度和可用性。这有助于提高安防监控系统的性能,及时发现潜在的安全威胁,保障人员和财产的安全。
     自动驾驶技术对图像质量的要求极高,雾气等恶劣天气条件会严重影响自动驾驶车辆的视觉感知系统。通过将本文的去雾算法集成到自动驾驶系统的图像处理模块中,可以实时去除摄像头捕获图像中的雾气,提高图像的清晰度和对比度,从而增强自动驾驶系统的环境感知能力,提高行车安全性。

三、算法实现步骤

(一)暗通道计算

     暗通道的计算是整个算法的基础。对于输入的图像 I,首先将其分解为红、绿、蓝三个颜色通道,然后计算每个像素点在局部区域内三个通道的最小值,得到暗通道图像 dark。具体实现中,使用了 OpenCV 的 cv::min函数来计算通道间的最小值,并通过 cv::erode 函数对暗通道图像进行腐蚀操作,以增强暗通道的特性。腐蚀操作的核大小由参数 sz 决定,该参数影响暗通道的计算范围和精度。

cv::Mat DarkChannel(const cv::Mat& im, int sz)
{
    std::vector<cv::Mat> channels;
    cv::split(im, channels);
  
    cv::Mat min_temp;
    cv::min(channels[0], channels[1], min_temp);
    cv::Mat dc;
    cv::min(channels[2], min_temp, dc);
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(sz, sz));
    cv::Mat dark;
    cv::erode(dc, dark, kernel);
    return dark;
}

(二)大气光估计

    大气光 A是图像中亮度较高且接近雾的颜色的像素点的平均值。为了估计大气光,首先需要从暗通道图像 dark 中选取亮度较高的像素点。具体方法是将暗通道图像 dark 展平为一维数组,然后按照像素值从高到低排序,选取前 numpx 个像素点对应的原始图像 I 中的像素值,计算其平均值作为大气光 A。其中,numpx 的值取决于图像的大小,通常取图像像素总数的千分之一左右。

(三)透射率估计

    透射率 t(x) 的估计是基于暗通道先验理论的关键步骤。根据暗通道先验理论,无雾图像的暗通道在局部区域内接近于零,而雾气会使暗通道变亮。因此,可以通过对图像进行归一化处理,使其与大气光 A 的比例接近于无雾图像的特性,然后计算归一化图像的暗通道,进而估计出透射率 t(x)。在实现中,引入了一个参数 ω(通常取值为 0.95),用于调整透射率的估计精度。

cv::Mat TransmissionEstimate(const cv::Mat& im, cv::Scalar A, int sz)
{
    double omega = 0.95;
    cv::Mat im3(im.rows, im.cols, CV_64FC3);

    for (int ind = 0; ind < 3; ind++)
    {
        im.convertTo(im3, CV_64FC3);
        im3 /= A[ind];
    }

    cv::Mat transmission = 1 - omega * DarkChannel(im3, sz);
    return transmission;
}

(四)透射率精炼

     透射率的初步估计可能存在噪声和不连续性,因此需要对其进行精炼处理。本文采用引导滤波(Guided Filter)算法对透射率进行精炼。引导滤波是一种基于局部线性模型的边缘保持滤波算法,能够有效地平滑透射率图像,同时保留图像的边缘信息。在实现中,以原始图像的灰度图作为引导图像,透射率图像作为输入图像,通过引导滤波算法得到精炼后的透射率图像。

(五)图像恢复

最后,根据估计出的透射率 t(x) 和大气光 A,利用大气散射模型的逆过程恢复出无雾图像 J(x)。在恢复过程中,为了避免透射率过小导致图像亮度异常放大,引入了一个截断参数 tx(通常取值为 0.1),将透射率 t(x) 的最小值限制为 tx。

cv::Mat Recover(const cv::Mat& im, const cv::Mat& t, cv::Scalar A, double tx = 0.1)
{
    cv::Mat res(im.size(), im.type());
    cv::Mat result;
    cv::Mat enhanced;
    cv::max(t, cv::Scalar(tx), result); // 将矩阵t和浮点数tx进行比较,并将较大的值赋给result

    std::vector<cv::Mat> channels;
    cv::split(im, channels);
    
    for (int ind = 0; ind < 3; ind++)
    {
        cv::Mat channel_float;
        channels[ind].convertTo(channel_float, CV_64F);
        cv::Mat result_float;
        result.convertTo(result_float, CV_64F);

        channels[ind] = (channel_float - A[ind]) / result_float + A[ind];
    }

    cv::merge(channels, res);
    res.convertTo(enhanced, CV_8UC3, 255);

    return  enhanced;
    
}

四、实验结果与分析

    为了验证基于暗通道先验的单幅图像去雾算法的有效性,选取了几幅不同场景和雾浓度的图像进行实验。

原图

去雾算法图

原图 

去雾算法图 

原图 

去雾算法图 

    实验结果表明,该算法能够有效地去除图像中的雾气,恢复出清晰的图像细节和色彩信息。例如,在处理城市街道场景的图像时,算法能够清晰地恢复出建筑物的轮廓和道路的纹理;在处理自然风景图像时,能够使远处的山峦和树木的细节更加明显,色彩更加鲜艳。

   然而,该算法也存在一些局限性。对于一些特殊场景,如天空区域或大面积的白色物体表面,暗通道先验理论可能不完全适用,导致去雾效果不够理想。此外,算法对图像的对比度有一定的依赖性,对于低对比度的图像,可能需要进行额外的对比度增强处理,以提高去雾效果。

五、总结与展望

     本文详细介绍了基于暗通道先验的单幅图像去雾算法的原理、公式推导以及实现过程。该算法凭借其出色的去雾效果和相对简洁的实现方式,在计算机视觉领域的图像去雾研究中具有重要地位。

    未来,随着计算机硬件性能的不断提升和深度学习技术的快速发展,图像去雾技术有望取得更大的突破。例如,结合深度学习模型和传统图像处理方法,可以进一步提高去雾算法的鲁棒性和适应性;同时,针对特殊场景和复杂天气条件下的图像去雾问题,也需要开展更加深入的研究,以满足实际应用中的多样化需求。总之,图像去雾技术的研究仍具有广阔的发展空间,值得我们持续关注和探索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值