PS色调均化滤镜的快捷实现(C#源代码)。

  photoshop色调均化功能通常是在进行修片处理前期比较常用的功能之一,其对扩展图像的对比度,增强视觉效果有一定的作用。在很多课本或者文章中,也称这种处理为灰度均衡化、直方图均衡化等等。算法原理都是对原始图像统计其直方图,然后通过累计分布函数,重新隐射直方图数据,使每个色阶的的分布概率都往一致的方向调整。我看到的网络上的代码,抑或是一些教材中的代码,对这个过程的描述都是相当的冗余,要么是代码累赘,效率低下,要么是萝莉啰唆,很是难受。

    在给出我的代码之前,还需要说明一些问题。对于灰度图像,由于只有一个通道,这个问题不明显,对于常见的24位图像,由于有RGB三个通道,那就存在是每个通道都单独均衡还是三通道联合计算直方图,然后利用相同的映射表在隐射RGB数据了,经过我的测试,在Photoshop中,是取的后者。

    for (Y = 0; Y < Height; Y++)
    {
        Pointer = Scan0 + Y * Stride;               // 定位到每个扫描行的第一个像素,以避免溶于数据的影响
        for (X = 0; X < Width; X++)
        {
            HistGram[*Pointer]++;                   // Blue
            HistGram[*(Pointer + 1)]++;             // Green
            HistGram[*(Pointer + 2)]++;             // Red    
            Pointer += 3;                           // 移向下一个像素
        }
    }
    Num = 0;
    for (Y = 0; Y < 256; Y++)
    {
        Num = Num + HistGram[Y];
        Lut[Y] = (byte)((float)Num / (Width * Height * 3) * 255);       // 计算映射表
    }
    for (Y = 0; Y < Height; Y++)
    {
        Pointer = Scan0 + Y * Stride;
        for (X = 0; X < Width * 3; X += 3)          //  也可以这样写
        {
            Pointer[X] = Lut[Pointer[X]];
            Pointer[X + 1] = Lut[Pointer[X + 1]];
            Pointer[X + 2] = Lut[Pointer[X + 2]];
        }
    }

  算法部分就是这么简单的二十几行代码,代码清晰,执行效率又特别高,数码相机中常见的4000*3000的照片100ms内就可以处理完。

    一副图像如果执行了一次色调均化,那么再次执行色调均化应该不会有任何像素发生变换了。

    从广义上讲,色调均化可以看成是直方图匹配的一个特例,即匹配的直方图分布为一条水平线。

    一些书中的色调均化是对各通道分别进行校正的,似乎这样处理的效果容易导致图像整体颜色不搭配,比如经典的Lena图:

                      原图                               PS的色调均化                               郎锐课本上的效果

   C#版色调均化代码:http://files.cnblogs.com/Imageshop/HistGramEqualize.rar

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小鹏的专栏

tf24: GANs—生成明星脸

GANs是Generative Adversarial Networks的简写,中文翻译为生成对抗网络,它最早出现在2014年Goodfellow发表的论文中...

2639
来自专栏C/C++基础

矩阵转置与矩阵相乘

写这篇博客的原因是为了记录一下矩阵转置与矩阵相乘的实现代码,供日后不时之需。直接原因是今晚(2016.09.13)参加了百度2017校招的笔试(C++岗),里面...

712
来自专栏Deep Learning in Ads

基于Field的DeepFM稀疏化实现

DeepFM是一个集成了FM和DNN的神经网络框架,思路和Google的Wide&Deep相似,都包括wide和deep两部分。W&D模型的wide部分是广...

2307
来自专栏人工智能头条

实战 | 手把手教你用PyTorch实现图像描述(附完整代码)

7947
来自专栏应兆康的专栏

Adjusted R-Squared

拟合度:调整R方 $\hat{R}^2=1-\frac{RSS/(n-d-1)}{TSS/(n-1)}$ 其中: * RSS为残差平方和 * TSS为总...

441
来自专栏微信模式识别中心技术分享

“变形金刚”为何强大:从模型到代码全面解析Google Tensor2Tensor系统

      Tensor2Tensor(T2T)是Google Brain Team在Github上开源出来的一套基于TensorFlow的深度学习系统。该系统...

6276
来自专栏小樱的经验随笔

模拟退火算法从原理到实战【基础篇】

  模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达...

2866
来自专栏null的专栏

机器学习算法实现解析——word2vec源码解析

在阅读本文之前,建议首先阅读“简单易学的机器学习算法——word2vec的算法原理”(目前还没发布),掌握如下的几个概念: 什么是统计语言模型 神经概率语言模型...

4497
来自专栏杨熹的专栏

TensorFlow-5: 用 tf.contrib.learn 来构建输入函数

学习资料: https://www.tensorflow.org/get_started/input_fn 对应的中文翻译: http://studyai....

3437
来自专栏AIUAI

Caffe2 - (三十) Detectron 之 modeling - 模型_heads

3917

扫码关注云+社区