数字图像处理(十一)白平衡算法

这篇具有很好参考价值的文章主要介绍了数字图像处理(十一)白平衡算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

  当一副彩色图像数字化后,在显示时颜色有时会看起来有些不正常。这是因为颜色通道中不同的敏感度、增光因子、偏移量等,导致数字化中的三个图像分量(R,G,B)出现不同的变换,使结果图像的三原色"不平衡",从而使景物中所有物体的颜色都偏离了其原有的真实色彩。彩色平衡处理的目的就是将有色偏的图像进行颜色校正,获得正常颜色的图像。白平衡方法使一种常见的彩色平衡处理方法。


一、白平衡算法原理

  白平衡原理是,如果原始场景中的某些像素点应该是白色的(即R=G=B=255),但是由于图像存在色偏,这些点的R、G、B三个分量的值不再保持相同,通过调整这三个颜色分量的值,使之达到平衡,由此获得对整幅图像的彩色平衡映射关系,通过该映射关系对整幅图像进行处理,即可达到彩色平衡的目的。

二、算法具体步骤

  实现白平衡的算法有很多,这里介绍一种基本的白平衡方法。

  1. 对拍摄到的有色偏的图像,按照下式计算该图像的亮度分量。 Y = 0.299 × R + 0.587 × G + 0.114 × B Y=0.299\times R+0.587\times G+0.114\times B Y=0.299×R+0.587×G+0.114×B由于存在色偏,即现实场景中白色的点,在图像中也可能不是理想状态的白色,即 Y ≠ 255 Y\neq255 Y=255。但是可以肯定的是,白色的亮度为图像中的最大亮度。所以需要求出图像中的最大亮度 Y m a x Y_{max} Ymax和平均亮度 Y ˉ \bar{Y} Yˉ
  2. 考虑对环境光照的适应性,寻找图像中所有亮度 ≤ 0.95 ⋅ Y m a x \le 0.95 \cdot Y_{max} 0.95Ymax的像素点。将这些点假设为原始场景中的白色点,即设这些点所构成的像素点集为白色点集 { f ( i , j ) ∈ Ω w h i t e } \{f(i,j)\in\Omega_{white}\} {f(i,j)Ωwhite}
  3. 计算白色点集 Ω w h i t e \Omega_{white} Ωwhite中所有像素的R、G、B三个颜色分量的均值 R ˉ \bar{R} Rˉ G ˉ \bar{G} Gˉ B ˉ \bar{B} Bˉ
  4. 按照下式计算颜色均衡调整参数: k R = Y ˉ G ˉ k_R=\frac{\bar{Y}}{\bar{G}} kR=GˉYˉ k G = Y ˉ G ˉ k_G=\frac{\bar{Y}}{\bar{G}} kG=GˉYˉ k B = Y ˉ B ˉ k_B=\frac{\bar{Y}}{\bar{B}} kB=BˉYˉ
  5. 对整幅图像的R、G、B三个颜色分量,进行彩色平衡调整如下: R ∗ = k R ⋅ R R^*=k_R\cdot R R=kRR G ∗ = k G ⋅ G G^*=k_G\cdot G G=kGG B ∗ = k B ⋅ B B^*=k_B\cdot B B=kBB

三、C++代码

int main()
{
    cv::Mat img = cv::imread("LenaRGB.bmp");

    int width= img.cols;
    int height = img.rows;
    cv::Mat Y = cv::Mat::zeros(height, width, CV_32FC1);

    cv::Mat R = cv::Mat::zeros(height, width, CV_8UC1);
    cv::Mat G = cv::Mat::zeros(height, width, CV_8UC1);
    cv::Mat B = cv::Mat::zeros(height, width, CV_8UC1);

    for (int row = 0; row < height; row++)
    {
        cv::Vec3b * current_ptr = img.ptr<cv::Vec3b>(row);
        for (int col = 0; col < width; col++)
        {
            R.at<uchar>(row, col) = (*(current_ptr + col))[2];
            G.at<uchar>(row, col) = (*(current_ptr + col))[1];
            B.at<uchar>(row, col) = (*(current_ptr + col))[0];
            Y.at<float>(row, col) = 0.299*(*(current_ptr + col))[2]+0.587*(*(current_ptr + col))[1]+
                                    0.144*(*(current_ptr + col))[0];
        }
    }

    //求取Ymax
    double minValue, Y_max;
    cv::minMaxLoc(Y, &minValue, &Y_max);
    float Y_value=0.0, R_value=0.0, G_value=0.0, B_value=0.0;
    int num = 0;
    for (int row = 0; row < height; row++)
    {
        float * current_ptr = Y.ptr<float>(row);
        for (int col = 0; col < width; col++)
        {
            if (*(current_ptr + col) >= 0.95*Y_max)
            {
                num += 1;
                Y_value += Y.at<float>(row, col);
                R_value += R.at<uchar>(row, col);
                G_value += G.at<uchar>(row, col);
                B_value += B.at<uchar>(row, col);
            }
        }
    }
    Y_value = Y_value / num;
    R_value = R_value / num;
    G_value = G_value / num;
    B_value = B_value / num;

    //调整系数
    float k_R = Y_value / R_value;
    float k_G = Y_value / G_value;
    float k_B = Y_value / B_value;

    cv::Mat output_image = cv::Mat::zeros(height, width, CV_32FC3);
    for (int row = 0; row < height; row++)
    {
        cv::Vec3b * img_ptr = img.ptr<cv::Vec3b>(row);
        cv::Vec3f * output_ptr = output_image.ptr<cv::Vec3f>(row);
        for (int col = 0; col < width; col++)
        {
            (*(output_ptr + col))[2] = k_R*(*(img_ptr + col))[2];
            (*(output_ptr + col))[1] = k_G * (*(img_ptr + col))[1];
            (*(output_ptr + col))[0] = k_B * (*(img_ptr + col))[0];
        }
    }
    cv::convertScaleAbs(output_image, output_image);
    cv::imshow("input_image", img);
    cv::imshow("output_image", output_image);
    return 0;
}

四、实验结果

数字图像处理(十一)白平衡算法

参考

1.数字图像处理基础.朱虹文章来源地址https://www.toymoban.com/news/detail-451865.html

到了这里,关于数字图像处理(十一)白平衡算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字图像处理(十三)图像放大及双线性插值算法

    图像放大是日常学习中经常要用到的两个算法,我们首先讨论缩放的流程以及放大时如何优化双线性插值算法。 采用国际标准测试图像Lena,为了方便,我们将读入的彩色图转为灰度图进行缩放。 和图像缩小不同,图像放大是小数据量到大数据量的处理过程,因此需要对许多

    2024年02月05日
    浏览(51)
  • 【MATLAB图像处理实用案例详解(8)】—— 图像数字水印算法

    数字水印技术作为信息隐藏技术的一个重要分支,是将信息(水印)隐藏于数字图像、视频、音频及文本文档等数字媒体中,从而实现隐秘传输、存储、标注、身份识别、版权保护和防篡改等目的。 随着 1996 年第一届信息隐藏国际学术研讨会的召开,数字水印技术的研究得到了迅

    2024年02月10日
    浏览(64)
  • 数字图像处理与Python实现-图像增强经典算法汇总

    本文将对图像增强经典算法做一个简单的汇总。图像增强的经典算法有:像素变换、图像逆变换、幂律变换、对数变换、图像均衡化、对比受限自适应直方图均衡(CLAHE)、对比度拉伸、Sigmoid校正、局部对比度归一化。 转换是将一组输入映射到一组输出的函数,这样每个输入

    2024年02月09日
    浏览(54)
  • 数字图像处理—美图秀秀:磨皮算法

    本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法 对于一些matlab较难实现的算法采用C++或python来实现 ⭐️ github地址:https://github.com/mibbp/MeituShow 里面有我完整的代码,你想直接运行记得看readme配置一下环境,本博客更多的

    2024年02月11日
    浏览(42)
  • Python实现数字图像处理算法及源码解析

    Python实现数字图像处理算法及源码解析 数字图像处理在计算机视觉、图像识别等领域中有着广泛的应用,Python作为一门易于上手且功能强大的编程语言,也成为了数字图像处理的首选语言之一。本篇文章将介绍数字图像处理中的常见算法,并提供相应的Python代码实现。 一、

    2024年02月08日
    浏览(48)
  • 数字图像处理 基于OpenCV的景深融合算法

            景深 合成是对显微镜头连续变焦时采集的非平面物体的图像序列进行分析,提取序列里每一帧图像中聚焦相对清晰的区域,然后对这些区域按其位置进行聚焦清晰度竞争、图像 融合 ,形成一幅新的各区域都清晰的全 景深 的图像。         这里算法的前提是图像

    2024年02月14日
    浏览(48)
  • 数字图像处理常用算法的原理和代码实现详解

      本专栏详细地分析了常用图像处理算法的数学原理、实现步骤。配有matlab或C++实现代码,并对代码进行了详细的注释。最后,对算法的效果进行了测试。相信通过这个专栏,你可以对这些算法的原理及实现有深入的理解!   如有疑问,欢迎在评论区留言讨论! Canny边缘

    2024年01月16日
    浏览(45)
  • python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法

    原理 Harris 角点检测是一种用于在图像中检测角点的算法。角点是图像中局部区域的交叉点或者突出的特征点。Harris 角点检测算法旨在寻找图像中对于平移、旋转和尺度变化具有不变性的角点。 该算法通过计算图像中每个像素点的灰度值的变化,来识别角点。具体来说,Ha

    2024年01月19日
    浏览(45)
  • 数字图像处理 - 形态学算法 - 颗粒划分 - 冈萨雷斯第三版 - 9.36

    形态学算法 - 颗粒分割 项目地址:https://github.com/LetMeFly666/MorphologicalAlgorithm_ParticleSegmentation 在线文档: https://maps.letmefly.xyz 显微应用中一个预处理步骤是从两组或更多组重叠的类似颗粒(见右图)中分离出单个独立的一种颗粒。假设所有颗粒的大小相同,提出一种产生3幅图

    2024年02月04日
    浏览(71)
  • 数字图像处理实验——数字图像处理初步

    一、实验目的与要求 1.熟悉及掌握在MATLAB中能够处理哪些格式的图像; 2.熟练掌握在MATLAB中如何读取图像及图像的属性信息(大小、颜色、亮度(灰度)、宽度、高度等); 3.掌握如何在MATLAB中按照指定要求存储一副图像的方法; 4.了解图像的算术运算在数字图像中的初步应

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包