图像偏色检测算法,速度快,效果好,共享给大家。      式中 ,M、 N分别为图像的宽和高,以像素为单位。在 a - b色度平面上,等效圆的中心坐标为 ( da , db ) ,半径为 M 。等效

     本文的算法并不是我自己提出的,而是一些论文中提出的,详见 :

     1、基于图像分析的偏色检测及颜色校正方法 徐晓昭 , 蔡轶珩 , 刘长江 , 贾克斌 , 沈兰荪

     2、皮肤检测技术的研究及改进

     为方便大家理解,这里还是从这些论文里摘取些具体的过程予以描述。

  RGB颜色空间是最简单的一种颜色空间,但是RGB颜色空间最大的局限性在于当用欧氏距离来刻画两种颜色之间的差异时,所计算出的两种颜色之间的距无法正确表征人们实际所感知到的这两种颜色之间的真实差异。采用CIE Lab颜色空间,此空间所计算出来的颜色之间的距离与实际感知上的差别基本一致。其直方图可以客观的反映图像色偏程度,在CIE Lab下进行偏色图像的自动检测更为合理。

      经过对正常图像和偏色图像的分析发现,如果在ab色度坐标平面上的直方图中,色度分布基本上为单峰值,或者分布较为集中,而色度平均值D又较大时,一般都存在色偏,而且色度平均值越大,色偏越严重。然而,如果在ab色度坐标平面上的直方图中色度分布存在明显的多峰值,而且较为分散时,图像色偏程度将大大减轻,甚至没有色偏。

如上图所示,第一个美女图明显就偏色,其[a,b]直方图明显有只有一个波峰,而第二个美女图则很协调,[a,b]直方图也分布的很均匀。

因此引入等效圆的概念 ,采用图像平均色度 D和色度中心距 M的比值 ,即偏色因子 K来衡量图像的偏色程度。其计算方法如下式

     式中 ,M、 N分别为图像的宽和高,以像素为单位。在 a - b色度平面上,等效圆的中心坐标为 ( da , db ) ,半径为 M 。等效圆的中心到 a - b色度平面中性轴原点为 ( a = 0, b = 0)的距离 D 。由等效圆在 a - b色度平面上的具体位置,来判断图像整体的偏色。da > 0,偏红,否则偏绿。db > 0,偏黄,否则偏蓝。引入偏色因子 K, K值越大 ,偏色越严重。

      按照上述细路编制的代码如下:

        //*****************************************************************************************
        //**    开发日期 :  2013-12-20
        //**    作    者 :  laviewpbt
        //**    联系方式:   33184777
        //**    修改日期 :  2013-7-15
        //**    版    本 :  Version 1.0.0
        //**    转载请不要删除以上信息
        //**    皮肤检测技术的研究及改进   重庆大学硕士论文  魏菁
        //*****************************************************************************************

        public static double GetColorCastFactor(Bitmap Bmp)
        {
            if (Bmp.PixelFormat != PixelFormat.Format24bppRgb) throw new ArgumentException("Only Support PixelFormat24RGB format Image.");
            Bitmap Lab = new Bitmap(Bmp.Width, Bmp.Height, PixelFormat.Format24bppRgb);
            int X, Y;
            int Width, Height, Stride;
            BitmapData BmpData, LabData;
          
            byte* Pointer;
            int SumA = 0, SumB = 0;
            double MsqA = 0, MsqB = 0, AvgA, AvgB;
            int A, B;

            int[] HistA = new int[256];
            int[] HistB = new int[256];
            BmpData = Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            LabData = Lab.LockBits(new Rectangle(0, 0, Lab.Width, Lab.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            Width = Bmp.Width; Height = Bmp.Height; Stride = BmpData.Stride; 
           
            for (Y = 0; Y < Height; Y++)
                ColorSpace.RGBLAB.ToLAB((byte*)BmpData.Scan0 + Y * Stride, (byte*)LabData.Scan0 + Y * Stride, Bmp.Width);
          
            for (Y = 0; Y < Height; Y++)
            {
                Pointer = (byte*)LabData.Scan0 + Y * Stride;
                for (X = 0; X < Width; X++)
                {
                    A = *(Pointer + 1); B = *(Pointer + 2);
                    SumA += A;
                    SumB += B;
                    HistA[A]++;
                    HistB[B]++;
                    Pointer += 3;
                }
            }
            AvgA = (double)SumA / (Width * Height) - 128;                  // 必须归一化到[-128,,127]范围内
            AvgB = (double)SumB / (Width * Height) - 128;
            for (Y = 0; Y < 256; Y++)
            {
                MsqA += (double)(Math.Abs(Y - AvgA - 128) * HistA[Y]) / (Width * Height);           // 用方差的方式结果有问题
                MsqB += (double)(Math.Abs(Y - AvgB - 128) * HistB[Y]) / (Width * Height);
            }
            Bmp.UnlockBits(BmpData);
            Lab.UnlockBits(LabData);
            Lab.Dispose();
            return Math.Sqrt(AvgA * AvgA + AvgB * AvgB) / Math.Sqrt(MsqA * MsqA + MsqB * MsqB);
        }

   其中的RGB到LAB空间转换部分代码及其优化可参考:颜色空间系列2: RGB和CIELAB颜色空间的转换及优化算法

      代码很简答吧,朋友们可以先按照公式自己编写下,然后再和我的最比下。看看那些地方的优化值得学习吧。

      按照上述我们做一些测试:

cast = 3.297788

cast=0.37389

cast=0.5028

cast=1.82749

                                                                            cast=1.699

      我们在测试一些明显偏色的图像。

cast =3.52449

cast =5.74808

cast=2.50289

                                                                             cast =4.08616

  上述四幅图的偏色明显比较验证,偏色因子的值也较大。

      在看看一些比较正常的照片吧.

cast=0.43784

cast =0.90216

cast=0.51927

                                                                               cast =1.216

 综合来说,cast值不大于1.5我们可以认为其整体图像偏色的可能性不大,当然这个值取多少可能还是需要和实际情况结合的。

xiaotie在其博客里也晒出了它的一种检测偏色的结果,我这里的计算复杂度可能没他哪里的复杂,不过也可以借鉴参考的。

       完整的代码见:http://files.cnblogs.com/Imageshop/ColorCast.rar

    博客园的网站分类里居然没有图像处理一栏,只有计算机图形学一项,其实搞这一行的都知道,这两个是完全不同的行业。希望博客园考虑增加图像处理一栏。

***************************作者: laviewpbt   时间: 2013.7.15    联系QQ:  33184777  转载请保留本行信息*************************

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

【论文推荐】最新八篇图像检索相关论文—三元组、深度特征图、判别式、卷积特征聚合、视觉-关系知识图谱、大规模图像检索

2473
来自专栏专知

【论文推荐】最新5篇深度学习相关论文推介——感知度量、图像检索、联合视盘和视杯分割、谱聚类、MPI并行

【导读】专知内容组整理了最近人工智能领域相关期刊的5篇最新综述文章,为大家进行介绍,欢迎查看! 1. The Unreasonable Effectivenes...

4176
来自专栏进击的程序猿

数据处理之PCA

视频地址:https://www.youtube.com/watch?v=koiTTim4M-s notebook地址:https://github.com/...

1232
来自专栏专知

【论文推荐】最新七篇强化学习相关论文—逻辑约束、综述、多任务深度强化学习、参数服务器、事件抽取、分层强化学习、过拟合研究

2451
来自专栏专知

【论文推荐】最新六篇图像描述生成相关论文—字符级推断、视觉解释、语义对齐、实体感知、确定性非自回归

2237
来自专栏AI研习社

126篇殿堂级深度学习论文分类整理 从入门到应用(下)

AI 研习社:本文接“126篇殿堂级深度学习论文分类整理 从入门到应用(上)”,是该整理的下半部分,即应用篇;按照各应用领域对论文进行分类。 3 应用 3.1 ...

3026
来自专栏专知

【论文推荐】最新八篇强化学习相关论文—残差网络、QMIX、元学习、动态速率分配、分层强化学习、抽象概况、快速物体检测、SOM

【导读】专知内容组整理了最近八篇强化学习(Reinforcement learning)相关文章,为大家进行介绍,欢迎查看! 1.BlockDrop: Dyna...

4895
来自专栏专知

【论文推荐】最新六篇图像检索相关论文—多模态反馈、二值约束深度哈希、绘制草图、对话交互式、多目标图像检索

【导读】专知内容组在前天为大家推出六篇图像检索(Image Retrieval)相关论文,今天又推出六篇图像检索相关论文,欢迎查看!

1633
来自专栏专知

【论文推荐】最新四篇CVPR2018 视频描述生成相关论文—双向注意力、Transformer、重构网络、层次强化学习

【导读】专知内容组在昨天推出八篇视频描述生成(Video Captioning)相关文章,今天为大家推出CVPR2018最新视频描述生成相关论文,欢迎查看!

2362
来自专栏Java与Android技术栈

图像直方图与直方图均衡化

图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。

1663

扫码关注云+社区