专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现点击上方“蓝字”关注“AI 开发者”

专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

本文来自 @BBuf 的社区专栏 GiantPandaCV,文末扫码即可订阅专栏。

前言

这是 OpenCV 图像处理专栏的第七篇文章,主要为大家介绍一下直方图均衡化算法的原理以及提供一个我的 C++代码实现。

介绍

直方图均衡化,是对图像进行非线性拉伸,使得一定范围内像素值的数量的大致相同。这样原来直方图中的封顶部分对比度得到了增强,而两侧波谷的对比度降低,输出的直方图是一个较为平坦的分段直方图。具体来讲可以表现为下面这个图:专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

通过这种方法可以按照需要对图像的亮度进行调整,并且,这种方法是可逆的,也就是说知道了均衡化函数,也可以恢复原始的直方图。

算法原理

设变量代表图像中像素灰度级。对灰度级进行归一化处理,即,其中表示黑,表示白。对于一幅给定的图片来说,每个像素在的灰度级是随机的,用概率密度来表示图像灰度级的分布。为了有利于数字图像处理,引入离散形式。在离散形式下,用代表离散灰度级,用代表,并且下式子成立:,其中。式子中代表图像中出现这种灰度的像素个数,是图像的总像素个数,图像进行直方图均衡化的函数表达式为 :,式子中,为灰度级数 (RGB 图像为 255)。相应的反变换为

代码实现

    // 直方图均衡化      Mat Histogramequalization(Mat hide) {          int R[256] = {0};          int G[256] = {0};          int B[256] = {0};          int rows = hide.rows;          int cols = hide.cols;          int sum = rows * cols;          // 统计直方图的 RGB 分布          for (int i = 0; i < rows; i++) {              for (int j = 0; j < cols; j++) {                  B[hide.at(i, j)[0]]++;                  G[hide.at(i, j)[1]]++;                  R[hide.at(i, j)[2]]++;              }          }          // 构建直方图的累计分布方程,用于直方图均衡化          double val[3] = {0};          for (int i = 0; i < 256; i++) {              val[0] += B[i];              val[1] += G[i];              val[2] += R[i];              B[i] = val[0] * 255 / sum;              G[i] = val[1] * 255 / sum;              R[i] = val[2] * 255 / sum;          }          // 归一化直方图          Mat dst(rows, cols, CV_8UC3);          for(int i = 0; i < rows; i++){              for(int j = 0; j < cols; j++){                  dst.at(i, j)[0] = B[hide.at(i, j)[0]];                  dst.at(i, j)[1] = B[hide.at(i, j)[1]];                  dst.at(i, j)[2] = B[hide.at(i, j)[2]];              }          }          return dst;      }  

效果

原图专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

直方图均衡化后的图专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

后记

本文为大家介绍了直方图均衡化算法,以及它的简单代码实现,希望可以帮助到你。

扫码订阅专栏
专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现

专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现专栏 | OpenCV 图像处理专栏七 | 直方图均衡化算法及代码实现点击阅读原文,查看专栏更多内容