opencv c++函数 imgproc模块 15 直方图均衡化

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

目标

在这个教程中你将学到:

  • 什么是图像的直方图和为什么图像的直方图很有用
  • 用OpenCV函数 equalizeHist 对图像进行直方图均衡化

原理

图像的直方图是什么?

  • 直方图是图像中像素强度分布的图形表达方式.
  • 它统计了每一个强度值所具有的像素个数.
../../../../../_images/Histogram_Equalization_Theory_0.jpg

直方图均衡化是什么?

  • 直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.
  • 说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图.
../../../../../_images/Histogram_Equalization_Theory_1.jpg

直方图均衡化是怎样做到的?

  • 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开.

  • 要想实现均衡化的效果, 映射函数应该是一个 累积分布函数 (cdf) (更多细节, 参考*学习OpenCV*). 对于直方图 H(i), 它的 累积分布 H^{'}(i) 是:

    H^{'}(i) = \sum_{0 \le j < i} H(j)

    要使用其作为映射函数, 我们必须对最大值为255 (或者用图像的最大强度值) 的累积分布 H^{'}(i) 进行归一化. 同上例, 累积分布函数为:

    ../../../../../_images/Histogram_Equalization_Theory_2.jpg
  • 最后, 我们使用一个简单的映射过程来获得均衡化后像素的强度值:

    equalized( x, y ) = H^{'}( src(x,y) )

例程

  • 咋个例程是用来干嘛的?

    • 加载源图像
    • 把源图像转为灰度图
    • 使用OpenCV函数 EqualizeHist 对直方图均衡化
    • 在窗体中显示源图像和均衡化后图像.
  • 下载例程: 点击 这里

  • 例程一瞥:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

/**  @function main */
int main( int argc, char** argv )
{
  Mat src, dst;

  char* source_window = "Source image";
  char* equalized_window = "Equalized Image";

  /// 加载源图像
  src = imread( argv[1], 1 );

  if( !src.data )
    { cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;
      return -1;}

  /// 转为灰度图
  cvtColor( src, src, CV_BGR2GRAY );

  /// 应用直方图均衡化
  equalizeHist( src, dst );

  /// 显示结果
  namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  namedWindow( equalized_window, CV_WINDOW_AUTOSIZE );

  imshow( source_window, src );
  imshow( equalized_window, dst );

  /// 等待用户按键退出程序
  waitKey(0);

  return 0;
}

说明

  1. 声明原图和目标图以及窗体名称:

    Mat src, dst;
    
    char* source_window = "Source image";
    char* equalized_window = "Equalized Image";
    
  2. 加载源图像:

    src = imread( argv[1], 1 );
    
    if( !src.data )
      { cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;
        return -1;}
    
  3. 转为灰度图:

    cvtColor( src, src, CV_BGR2GRAY );
    
  4. 利用函数 equalizeHist 对上面灰度图做直方图均衡化:

    equalizeHist( src, dst );
    

    可以看到, 这个操作的参数只有源图像和目标 (均衡化后) 图像.

  5. 显示这两个图像 (源图像和均衡化后图像) :

    namedWindow( source_window, CV_WINDOW_AUTOSIZE );
    namedWindow( equalized_window, CV_WINDOW_AUTOSIZE );
    
    imshow( source_window, src );
    imshow( equalized_window, dst );
    
  6. 等待用户案件退出程序

    waitKey(0);
    return 0;
    

结果

  1. 为了更好地观察直方图均衡化的效果, 我们使用一张对比度不强的图片作为源图像输入, 如下图:

    ../../../../../_images/Histogram_Equalization_Original_Image.jpg

    它的直方图为:

    ../../../../../_images/Histogram_Equalization_Original_Histogram.jpg

    注意到像素大多集中在直方图中间的强度上.

  2. 使用例程进行均衡化后, 我们得到下面的结果:

    ../../../../../_images/Histogram_Equalization_Equalized_Image.jpg

    这幅图片显然对比度更强. 再验证一下均衡化后图片的直方图:

    ../../../../../_images/Histogram_Equalization_Equalized_Histogram.jpg

    注意到现在像素在整个强度范围内均衡分布.

OpenCV直方图均衡化与CLAHE算法详解 直方图均衡化是数字图像处理中的基础对比度增强技术,通过重新分配像素灰度值使输出直方图近似均匀分布。其核心是构建累积分布函数(CDF)映射,OpenCV采用查找表(LUT)优化实现高效计算。针对全局均衡化的局限性,CLAHE算法通过分块处理引入局部适应性,关键参数clipLimit控制对比度增强强度。这些技术在医学影像、遥感图像等领域有广泛应用,OpenCV的实现结合了双线性插值消除块效应,并进行了多线程等性能优化。理解直方图均衡化与CLAHE的原理有助于在图像增强、计算机视觉任务中合理选择参数,平衡对比度增 阅读详情

相关推荐

OpenCV imgproc模块深度解析:从C++图像处理基础到高级优化实战

图像处理是计算机视觉的基础,其核心在于通过算法对像素数据进行变换、分析和理解。从原理层面看,图像处理技术主要涉及色彩空间转换、滤波降噪、形态学操作、边缘检测与轮廓分析等经典算法,这些算法共同构成了图像信息提取与增强的技术基石。在工程实践中,OpenCVimgproc模块提供了这些算法的工业级高效实现,其价值在于为安防监控、自动驾驶、工业视觉等实时性要求高的应用场景提供了稳定可靠的基础设施。本文聚焦于imgproc模块C++深度应用,通过剖析色彩空间转换、图像滤波、形态学操作等核心功能,结合C++与Pyt

weixin_29169899的博客 300

53-OpenCVSharp —-Cv2.EqualizeHist()函数功能(直方图均衡化)详解

OpenCV 中一个非常有用的函数,尤其在低对比度图像增强方面发挥了重要作用。它通过均衡化图像的直方图,重新分配灰度值,显著提高了图像的对比度,特别适用于低光环境下的图像处理。该函数简单高效,但也存在一些不足,如可能导致过度增强或不适用于彩色图像等。在使用过程中,建议根据图像的特性选择合适的增强方法,有时与其他图像处理方法结合使用(如高斯滤波、CLAHE等)会产生更好的效果。此外,尽管在许多场景中有效,但在处理高对比度、噪声较多或纹理复杂的图像时,可能需要进一步优化或调整算法参数。

weixin_45590420的博客 1715

OpenCV C++图像增强实战:直方图均衡化、空间滤波与伽马校正原理与实现

图像增强是计算机视觉和图像处理领域的基础技术,其核心原理是通过调整图像的像素值分布,改善图像的视觉质量或使其更适合后续算法分析。从技术实现上看,主要分为空间域和频率域两大类方法,其中空间域增强因其计算高效、直观易懂,在工程实践中应用最为广泛。其技术价值在于能够有效提升图像中关键信息的可辨识度,例如增强边缘细节、改善对比度、抑制噪声等,从而为人眼观察或下游的机器学习模型提供更优质的输入。典型的应用场景包括医学影像的病灶增强、自动驾驶中的恶劣天气图像清晰化、安防监控中的人脸识别预处理等。本文聚焦于使用OpenC

weixin_34296641的博客 345

【全网独家】OpenCV: 直方图均衡化 (equalizeHist)

直方图均衡化是一种简单而有效的图像增强技术,通过重新分布图像的灰度值来提高对比度。利用OpenCV,可以方便地对图像进行直方图均衡化处理,改善图像的视觉效果。虽然该方法在很多场景中都有广泛应用,但也有一定的局限性,例如对于已具有良好对比度的图像,可能效果有限。

走向CTO的路上... 811

42.图像直方图均衡化

其中,src(x, y)是输入图像中坐标为(x, y)处的像素值,cdf(src(x, y))是该像素值的累积概率密度函数,L是输出图像的灰度级别数量(通常为256),M和N分别是输入图像的行数和列数,cdf_min是累积概率密度函数的最小值。它的核心思想是将原始图像的灰度级别映射到一个新的范围内,使得图像的灰度级别更加均匀。图像直方图均衡化(Histogram Equalization)是一种通过调整图像的灰度级别分布,使得图像在亮度和对比度上更加均匀的操作。它可以增强图像的细节,并改善图像的视觉效果。

twnkie的博客 288

数字图像处理:OpenCV-Python中的直方图均衡知识介绍及函数equalizeHist详解

本文介绍了OpenCV官方提供的直方图均衡原理、算法及算法实现样例,以及OpenCV-Python中的直方图均衡函数equalizeHist的调用语法、参数及返回值说明、处理过程描述,最后提供了一个使用equalizeHist函数对经典的两张直方图均衡样例图的处理代码和处理效果。通过相关内容的介绍,有助于大家理解直方图均衡的原理、算法及OpenCV中的处理方法。

老猿Python 9184

利用OpenCV函数equalizeHist()对图像作直方图均衡化处理

利用OpenCV函数equalizeHist()对图像作直方图均衡化处理

昊虹AI笔记 1778

imgproc模块--直方图均衡化

imgproc模块--直方图均衡化

nnUyi的博客 598

opencv直方图均衡化-equalizeHist函数

直方图均衡化的概念和特点: 图像的像素灰度变化是随机的,直方图的图形高低不齐,直方图均衡化就是用一定的算法使直方图大致平和的方法。 说简单一点,直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。 注意: 在原图像对比度本来就很高的情况下,如果再均衡化则会使灰度调和,对比度会降低。在泛白缓和的图像中,均衡化会合并一些像素灰度,从而增大对比度。均衡化后的图片如果再对其均衡化,则图像不会有任何变化。 由equalizeHist函数实现的灰度直方图均衡化算法,就是把直方图每个灰度级进行归一

帕帕尼的博客 1340

opencv c++函数 imgproc模块 16 直方图计算

目标 本文档尝试解答如下问题: 如何使用OpenCV函数 split 将图像分割成单通道数组。如何使用OpenCV函数 calcHist 计算图像阵列的直方图。如何使用OpenCV函数 normalize 归一化数组。 Note   在上一篇中 (直方图均衡化) 我们介绍了一种特殊直方图叫做 图像直方图 。现在我们从更加广义的角度来考虑直方图的概念,继续往下读!

CV菜鸟的学习之路 1771

OpenCV学习笔记(八)——图像处理之直方图ImgProc

直方图histograms也是图像处理中经常用到的一种手段。新版本对直方图不再使用之前的histogram的形式,而是用统一的Mat或者MatND的格式来存储直方图,可见新版本Mat数据结构的优势。先介绍下其相关的函数 calcHist、calcBackProject、compareHist、EMD、equalizeHist。除了这几个常用的函数以为,还有一些c函数写的直方图类CvHistogr

迭代的是人,递归的是神 3万+

OpenCV学习笔记——图像处理之直方图ImgProc

直方图histograms也是图像处理中经常用到的一种手段。新版本对直方图不再使用之前的histogram的形式,而是用统一的Mat或者MatND的格式来存储直方图,可见新版本Mat数据结构的优势。先介绍下其相关的函数 calcHist、calcBackProject、compareHist、EMD、equalizeHist。除了这几个常用的函数以为,还有一些c函数写的直方图类CvHisto

kobebrian7的专栏 784

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍 OpenCV 库,包括它的主要模块和典型应用场景,同时使用 OpenCV-Python 实战讲解图像处理基础要点。

盼小辉丶的博客 27万+

OpenCVOpenCV3的第六天——imgproc组件之图像变换

imgproc组件:Image Process,即图像处理模块; 图像滤波; 几何变换; 图像转换; 直方图相关; 结构分析和形状描述; 运动分析和对象跟踪; 特征检测; 目标检测;

Taily老段的专栏 1329

基于Qt/C++OpenCV构建桌面贴片机控制软件框架

机器视觉与自动化控制是工业自动化领域的核心技术。其原理在于通过图像传感器获取环境信息,并利用算法进行处理与分析,进而驱动执行机构完成精确操作。这项技术的核心价值在于能够替代人眼进行高速、高精度的检测与定位,大幅提升生产效率和一致性。在电子制造、精密装配等应用场景中,机器视觉是实现自动化生产线的关键环节。本文聚焦于利用OpenCV实现视觉定位与角度检测,并结合Qt框架构建模块化控制软件,具体探讨了如何从零搭建一个用于半导体贴片机的“拾取-视觉校正-放置”核心闭环系统,涵盖了硬件抽象、路径优化等工程实践要点。

weixin_30321709的博客 384

图像锐化、直方图均衡、图像增强、图像滤波

参考: https://www.cnblogs.com/wangguchangqing/category/740760.html 1. 拉普拉斯算子锐化 算法实现: #include <iostream> #include <opencv2/highgui.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/imgproc.hpp> using namespace std; using name

正在挣扎中的人 1060

C++ OpenCV实战指南:从环境搭建到深度学习部署

计算机视觉作为人工智能的核心分支,通过算法让机器“看懂”图像与视频,其原理涉及图像处理、模式识别和机器学习。这项技术能高效提取并分析视觉信息,在自动驾驶、工业检测和增强现实等领域具有极高价值。OpenCV作为开源计算机视觉库,提供了丰富的算法实现,而C++凭借其高性能和精细的内存控制,成为工业级视觉系统的首选。本文聚焦C++OpenCV的工程实践,详细解析了开发环境配置、核心数据结构cv::Mat的操作、特征提取与目标检测等关键模块,并深入探讨了性能优化和现代C++特性结合等工程化议题,为开发者构建高效、

337
上一篇: opencv c++函数 imgproc模块 14 仿射变换
下一篇: opencv c++函数 imgproc模块 16 直方图计算
淡淡的生活
博客等级 码龄16年 341粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值