自动色阶、自动对比度以及直方图均衡这三个算法虽然很普通,也很简单,但是在实际应用中有着非常高的使用率,特别是在修图中,很多设计师打开一幅图,首先的的操作就是Shift+Ctrl+L(自动色阶)。在原理实现上,他们都属于基于直方图统计方面的算法,执行效率都非常之高。我在调整图像- 自动对比度、自动色阶算法一文中对他们的过程进行了详细的分析和解读,这里不在详述。

  但是有的时候我们发现自动色阶或对比度等等会过调整或欠调整,在某个软件(不记得是那个了)中我发现了对他们的一些改进方式,其核心改进如下:

普通的方式:

    for (int Y = 0; Y < 256; Y++){if (Y < Min)Table[Y] = 0;else if (Y > Max)Table[Y] = 255;elseTable[Y] = IM_ClampToByte((float)(Y - Min) / (Max - Min) * 255);}

  改进后的方式:

    float Avg = 0, Mean = 0, Sum = 0;for (int Y = 0; Y < 256; Y++){Sum += Histgram[Y];Avg += Y * Histgram[Y];}Mean = Avg / Sum;float Gamma = log(0.5f) / log((float)(Mean - Min) / (Max - Min));if (Gamma < 0.1f)Gamma = 0.1f;else if (Gamma > 10)Gamma = 10;for (int Y = 0; Y < 256; Y++){if (Y < Min)Table[Y] = 0;else if (Y > Max)Table[Y] = 255;elseTable[Y] = IM_ClampToByte(pow((float)(Y - Min) / (Max - Min), Gamma) * 255);}

  其中的Max和Min的意思请参考其他的文章。

  改进后的查找表考虑到全图的一个平均值信息,根据这个平局值来决定调整的一个Gamma值,相当于他同时结合了Gamma校正和自动色阶的思想,普通的自动色阶对应Gamma=1,还是拿一些我常用的测试图举例吧。

      

      

            原图                      标准的自动色阶                          改进后的自动色阶

  似乎改进后的更为合理。

  对于直方图均衡化的改进,我在ImageJ的代码中找到这样一段话:

//    Changes the tone curves of images.
//    It should bring up the detail in the flat regions of your image.
//    Histogram Equalization can enhance meaningless detail and hide important but small high-contrast features. This method uses a
//    similar algorithm, but uses the square root of the histogram values, so its effects are less extreme. Hold the alt key down
//    to use the standard histogram equalization algorithm. This code was contributed by Richard Kirk (rak@cre.canon.co.uk).
//    ImageJ\source\ij\plugin\ContrastEnhancer.java

  他的核心代码修改如下:

private void equalize(ImageProcessor ip, int[] histogram)
{ip.resetRoi();if (ip instanceof ShortProcessor) {  // Shortmax = 65535;range = 65535;} else { //bytesmax = 255;range = 255;}double sum;sum = getWeightedValue(histogram, 0);for (int i=1; i<max; i++)sum += 2 * getWeightedValue(histogram, i);sum += getWeightedValue(histogram, max);double scale = range/sum;int[] lut = new int[range+1];lut[0] = 0;sum = getWeightedValue(histogram, 0);for (int i=1; i<max; i++) {double delta = getWeightedValue(histogram, i);sum += delta;lut[i] = (int)Math.round(sum*scale);sum += delta;}lut[max] = max;applyTable(ip, lut);
}

  

private double getWeightedValue(int[] histogram, int i) {int h = histogram[i];if (h<2 || classicEqualization) return (double)h;return Math.sqrt((double)(h));
}

  他这里主要是对直方图的数据进行了开根号,这样可以减少有些色阶特别集中的直方图对修正后的图像的影响,他可以解决普通的直方图均衡化有时候处理起来图像变换太大的问题,我们同样以上述两幅图来做示范。

      

      

                                       原图                        标准的直方图均衡化                     改进后的直方图均衡化

  可以明显的看到,标准的直方图均衡化对两幅图的处理都太过分,而改进后的则效果要和谐和自然很多。

  这种改进还可以嵌入到很多其他的和直方图有关的算法中,比如CLAHE等等,也可以有效的改进他们的效果。

  本人的SSE算法优化合集DEMO: http://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar。

  

转载于:https://www.cnblogs.com/Imageshop/p/11352392.html

【算法随记四】自动色阶、对比度、直方图均衡等算法的一些小改进。相关推荐

  1. STL中算法锦集(四)

    STL中算法锦集(四) 文章目录 STL中算法锦集(四) 一.< algorithm > 1.std::is_permutation 2.std::is_sorted 3.std::is_ ...

  2. 第四百一十四节,python常用算法学习

    本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  3. MUSICA(多尺度图像对比度增强)算法的简要原理及VC实现-1[r]

    MUSICA的专利文档:MUSICA_patent - Original document.pdf 算法原理:     图像增强的一般方法是对比度拉伸和直方图均衡,这两种方法对于灰度级过于集中, 还有 ...

  4. 算法基础课——第四章 数学知识(一)

    第四章 数学知识(一) 如无特殊说明,所有数均为正整数 质数 质数: 针对所有大于 111​​​ 的自然数来说,如果只包含 111​​ 和本身 这两个约数,就被称为质数,或者叫素数:否则被称为 合数. ...

  5. C#开发技术点说明-四种简单的排序算法,AJAX,Http Module,Http 请求处理流

    我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF.Asp.Net MVC.AJAX等,熟练应用一些已经比较成熟的技术,比如Asp.Net.WinForm.还应该有着牢固的计 ...

  6. LeetCode-笔记-45.跳跃游戏II-贪心算法

    LeetCode-笔记-45.跳跃游戏II-贪心算法 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后 ...

  7. 四、垃圾收集之垃圾收集算法

    2019独角兽企业重金招聘Python工程师标准>>> 一.标记-清除算法 最基础的收集算法,其余的算法基本都是由此算法改进得来 效率不高,标记和清除的过程效率都不高 清除之后会产生 ...

  8. DL之LSTM:基于《wonderland爱丽丝梦游仙境记》小说数据集利用LSTM算法(层加深,基于keras)对单个character字符预测

    DL之LSTM:基于<wonderland爱丽丝梦游仙境记>小说数据集利用LSTM算法(层加深,基于keras)对单个character字符预测 目录 基于<wonderland爱丽 ...

  9. 【算法随记一】Canny边缘检测算法实现和优化分析。

    以前的博文大部分都写的非常详细,有很多分析过程,不过写起来确实很累人,一般一篇好的文章要整理个三四天,但是,时间越来越紧张,后续的一些算法可能就以随记的方式,把实现过程的一些比较容易出错和有价值的细节 ...

  10. IDEA配置java《算法》第四版环境(耗时6小时,总算配置成功了,希望能给大家一点帮助)

    0.前言 最近在学java语言,然后想用java语言来学习算法,在网上听说看<算法>第四版学习java算法不错,于是就去下载了<算法>电子书来啃 今天看到了用java java ...

最新文章

  1. echarts数据变了不重新渲染,以及重新渲染了前后数据会重叠渲染的问题
  2. Code First 数据库的表中属性的配置
  3. 给FlvDownloader加了一个视频预览的功能
  4. java用while循环语句输出1-100内的奇数和
  5. 汇编语言:编写代码实现字符串的复制
  6. Linux: 系统结构详解
  7. 声音模仿_学唱歌 |唱歌声音难听的解决方法有哪些?这里给你总结总结!
  8. 解决 Python 连不上pip库的问题(使用国内镜像地址)
  9. css3中word-wrap与wrod-break的区别
  10. 计算两点间距离C++
  11. api与密度转换公式_原油API度与比重换算表摄氏15
  12. 【学习—Scrapy1】日常操作
  13. Kafka监控eagle
  14. 微分恒等式(助于找到均值、方差和其他矩)
  15. 小米红米Note12,11,Pro系列安装谷歌套件谷歌服务框架GMS,Google Play商店
  16. 关于Linux LOOPBACK网口抓包的一个细节
  17. idea 中git 将 dev 分支合并到 master 分支 或将master 分支 合并到dev 分支
  18. UE4源码阅读_骨骼模型与动画系统_Mesh
  19. 数字孪生能源系统,打造低碳时代“透视”眼
  20. Intel Turbo Boost (睿频)技术简介

热门文章

  1. winfrom的DataGridView控件选中行的DataGridViewLinkColumn列字体颜色的改变
  2. poj 1969 Count on Canton 摘规律
  3. Illustrator 教程,如何在 Illustrator 中添加一行文字?
  4. 《Programming in Lua 3》读书笔记(九)
  5. Linux中的任务调度
  6. 微信企业号支付个人php实现
  7. 安装项目管理工具 SVN+Redmine
  8. sql语句select group by order by where一般先后顺序
  9. Scala + Intellij IDEA 环境搭建及编译、打包
  10. 浅谈Eclipse dropins插件安装的坑(附m2e的各个版本插件下载)