目录
  • 直方图均衡化介绍
    • 图像的直方图是什么?
      • 更形象解释
    • 什么是直方图均衡化?
      • 直方图均衡化是如何实现的?
        • 直方图均衡化的作用
        • 直方图均衡化步骤
          • 相关API
            • equalizeHist
            • 代码示例
              • 灰度图均值化
                • 彩色图均值化

                直方图均衡化介绍

                图像的直方图是什么?

                图像直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图。直方图反映了图像灰度的分布情况。是图像的统计学特征。

                简单来说:直方图是图像中像素强度分布的图形表达方式,它统计了每一个强度值所具有的像素个数。

                例如下面这张图片,左图为灰度图,右图统计了这张图的所有像素值(0~255)对应的像素个数

                OpenCV 直方图均衡化的实现原理解析

                更形象解释

                更形象的来说,将下面像素格子对等为如上图的图像

                假设有该图像数据8×8,像素值范围0~14共15个灰度等级,统计得到各个等级出现次数及直方图如下图所示:

                OpenCV 直方图均衡化的实现原理解析

                则对上面抽象出来的图像(像素格子)进行像素与出现次数的统计得到下图左侧的表格,做出频率图如右图所示:

                OpenCV 直方图均衡化的实现原理解析

                什么是直方图均衡化?

                是一种提高图像对比度的方法,拉伸图像灰度值范围。

                简单来说, 以上面狗狗的的直方图为例, 你可以看到像素主要集中在中间的一些强度值上。直方图均衡化要做的就是 拉伸 这个范围。就是下面蓝框框出来的范围就是像素主要几种区间。

                OpenCV 直方图均衡化的实现原理解析

                见下图:绿圈 圈出了 像素分布率较低像素值,对其应用均衡化后(将中间蓝框像素分布较高的区间拉伸), 得到了中间图所示的直方图。均衡化的图像见下面右图.

                OpenCV 直方图均衡化的实现原理解析

                直方图均衡化是如何实现的?

                通过remap我们知道可以将图像灰度分布从一个分布映射到另外一个分布,然后在得到映射后的像素值即可。

                映射关系如下:

                OpenCV 直方图均衡化的实现原理解析

                其中源直方图 H(i), 累积分布 H’(i)函数,equalized()为重映射后的图像

                直方图均衡化的作用

                因为直方图均衡化处理之后,原来比较少像素的灰度会被分配到别的灰度去,像素相对集中, 处理后灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。

                直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

                总的来说,直方图均衡化是用来增强对比度的

                直方图均衡化步骤

                1. 加载源图像
                2. 转为灰度图
                3. EqualizeHist 对直方图均衡化
                4. 显示均衡化后图像.

                相关API

                equalizeHist

                cv::equalizeHist(
                	InputArray src,	// 输入图像,必须是8-bit的单通道图像
                	OutputArray dst	// 输出结果
                )

                代码示例

                灰度图均值化

                OpenCV 直方图均衡化的实现原理解析

                #include <iostream>
                #include <math.h>
                #include <opencv2/opencv.hpp>
                #include <opencv2/highgui.hpp>
                #include <opencv2/highgui/highgui_c.h> 
                
                using namespace cv;
                int main(int argc, char** argv) 
                {
                	Mat src, dst;
                	src = imread("./test2.jpg");
                	if (!src.data) {
                		printf("could not load image...\n");
                		return -1;
                	}
                	cvtColor(src, src, CV_BGR2GRAY);
                	equalizeHist(src, dst);
                	char INPUT_T[] = "input image";
                	char OUTPUT_T[] = "result image";
                	namedWindow(INPUT_T, CV_WINDOW_AUTOSIZE);
                	namedWindow(OUTPUT_T, CV_WINDOW_AUTOSIZE);
                	imshow(INPUT_T, src);
                	imshow(OUTPUT_T, dst);
                	waitKey(0);
                	return 0;
                }

                彩色图均值化

                OpenCV 直方图均衡化的实现原理解析

                #include <iostream>
                #include <math.h>
                #include <opencv2/opencv.hpp>
                #include <opencv2/highgui.hpp>
                #include <opencv2/highgui/highgui_c.h> 
                
                using namespace cv;
                using namespace std;
                int main(int argc, char*argv)
                {
                	Mat src, dst, dst1;
                	src = imread("./test2.jpg");
                	if (!src.data)
                	{
                		printf("could not load image...\n");
                		return -1;
                	}
                	char input[] = "input image";
                	char output[] = "histogram iamge";
                	namedWindow(input, CV_WINDOW_AUTOSIZE);
                	namedWindow(output, CV_WINDOW_AUTOSIZE);
                	imshow(input, src);
                	// 分割通道
                	vector<Mat>channels;
                	split(src, channels);
                	Mat blue, green, red;
                	blue = channels.at(0);
                	green = channels.at(1);
                	red = channels.at(2);
                	// 分别对BGR通道做直方图均衡化
                	equalizeHist(blue, blue);
                	equalizeHist(green, green);
                	equalizeHist(red, red);
                	// 合并通道
                	merge(channels, dst);
                	imshow(output, dst);
                	waitKey(0);
                	return 0;
                }
                声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。