直方图均衡化算法原理与实现

直方图均衡化算法原理与实现直方图均衡化算法原理与实现

工作后,对原来学习的一些基本图像处理算法有了一些新的认识,比如Canny 算法,直方图均衡化算法等,今天就来说说直方图均衡化算法。


直方图均衡化原理

我们知道提高图像对比度的变换函数 f ( x ) f(x) f(x)需要满足一下条件:

  1. f ( x ) f(x) f(x) 0 < = x < = L − 1 0<=x<=L-1 0<=x<=L1上单调递增(不要求严格单调递增),其中L表示灰度级(L=256)
  2. f ( x ) f(x) f(x)的范围是 [ 0 , L − 1 ] [0,L-1] [0,L1]

我们知道当图像直方图完全均匀分布的时候,此时图像的熵是最大的(随机变量每个值的概率都相同时,概率最大),图像对比度是最大的。所以,理想情况下,图像经过变换函数 f ( x ) f(x) f(x)变换后,直方图能够均匀分布,此时对比度是最大的。

这里写图片描述

分布函数的两个性质:1.单调不减 2.值域为[0,1],我们可以知道f(x)满足条件1和2

有人可能会有这个疑问?图像是离散的,为什么可以用连续的来表示呢?从数学角度来看,离散是连续的一种特例(图像就是一个很好的例子)。

其中 h ( x i ) h(x_i) h(xi)表示直方图中每个灰度级像素的个数, w w w h h h分别表示图像的宽和高。


直方图均衡化算法实现

根据上面的推导,算法实现如下:

//不支持OpenCV的ROI void GetHistogram(const Mat &image, int *histogram) { memset(histogram, 0, 256 * sizeof(int)); //计算直方图 int pixelCount = image.cols*image.rows; uchar *imageData = image.data; for (int i = 0; i <= pixelCount - 1; ++i) { int gray = imageData[i]; histogram[gray]++; } } void EqualizeHistogram(const Mat &srcImage, Mat &dstImage) { CV_Assert(srcImage.type() == CV_8UC1); dstImage.create(srcImage.size(), srcImage.type()); // 计算直方图 int histogram[256]; GetHistogram(srcImage, histogram); // 计算分布函数(也就是变换函数f(x)) int numberOfPixel = srcImage.rows*srcImage.cols; int LUT[256]; LUT[0] = 1.0*histogram[0] / numberOfPixel*255; int sum = histogram[0]; for (int i = 1; i <= 255; ++i) { sum += histogram[i]; LUT[i] = 1.0*sum / numberOfPixel * 255; } // 灰度变换 uchar *dataOfSrc = srcImage.data; uchar *dataOfDst = dstImage.data; for (int i = 0; i <= numberOfPixel - 1; ++i) dataOfDst[i] = LUT[dataOfSrc[i]]; } 

测试结果:

这里写图片描述
从直方图均衡化算法中,可以看出,看似简单的几个算法步骤,背后蕴藏了很多数学理论知识,这大概就是数学的魅力吧。


2016-9-3 10:41:39


参考文献

  1. 《数字图像处理》第3版,冈萨雷斯

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178158.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:53
下一篇 2026年3月26日 下午5:54


相关推荐

  • css自定义滚动条颜色

    css自定义滚动条颜色针对 webkit 内核的浏览器 使用伪类来改变滚动条的默认样式滚动条组成部分 webkit scrollbar 滚动条整体部分 webkit scrollbar thumb 滚动条里面的小方块 能向上向下移动 或向左向右移动 webkit scrollbar track 滚动条的轨道 里面装有 Thumb webkit scrollbar button 滚动条的轨道的两端按钮 由于通过点击微调小方块的位置 webkit scrollbar trac

    2026年3月17日
    2
  • 如何本地化部署豆包大模型

    如何本地化部署豆包大模型

    2026年3月12日
    2
  • Presto实战

    Presto实战一、Presto简介1、PRESTO是什么?Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。Presto的设计和编写完全是为了解决像Facebook这样规

    2022年8月4日
    14
  • Claude Code 高级配置完整指南

    Claude Code 高级配置完整指南

    2026年3月15日
    3
  • 易玩卡盟怎么样_支付接口集成平台

    易玩卡盟怎么样_支付接口集成平台支持一键装修主站,一键对接货源,自定义后台登录背景,前台风格自定义背景等,已集成易支付接口对接易支付充值接口,修复BUG等服务器系统可以:Windows64/Linux64/cenos6.864位安装宝塔环境:apache2.4+mysql5.5+php5.6cenos6.8系统安装宝塔命令:yuminstall-ywgetamp;amp;wget-Oinstall.shhttp://downlo…

    2022年8月13日
    9
  • java前端和后端的区别[通俗易懂]

    java前端和后端的区别[通俗易懂]java”前端”是与用户直接交互的部分,包括你在浏览网页时接触的所有视觉内容–从字体到颜色,以及下拉菜单和侧边栏。这些视觉内容,都是由浏览器解析、处理、渲染相关HTML、CSS、Javascript文件后呈现而来。java后端开发者使用这些工具编写干净、可移植、具有良好文档支持的代码来创建或更新Web应用。但在写代码之前,他们需要与客户沟通,了解其实际需求并转化为技术目标,制定最有效且精简的方案来进行实现。 java”前端”开发,就是要创造上面提到的网站面向用户的部分背后的代码,并.

    2022年7月9日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号