IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCV图像处理学习二十,图像直方图均衡化原理与实现 -> 正文阅读

[人工智能]OpenCV图像处理学习二十,图像直方图均衡化原理与实现

一.图像直方图的概念

图像直方图,是指对整个图像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图。直方图反映了图像灰度的分布情况,是图像的统计学特征。图像的灰度直方图就描述了图像中灰度分布情况, 能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级的函数, 描述的是图像中具有该灰度级的像素的个数: 其中, 横坐标是灰度级, 纵坐标是该灰度级出现的率。

图像直方图表示图像中每一等级像素的个数,反映了图像中每种像素值出现的频率,是图像的基本统计特征之一,具有平移,旋转,缩放不变性,广泛应用于图像处理的各个领域。比如灰度图像的阈值分割,基于颜色的图像检索,图像的分类等。直方图横坐标表示像素值,纵坐标表示该像素值的个数,常见的有灰度直方图和颜色直方图。

?假设有图像像素分布数据长度和宽度为8x8,像素值范围分为0~14共15个灰度等级,统计得到各个等级出现的像素值次数及直方图如下图所示,每个紫色的长条叫BIN。

直方图中的 BINS, DIMS 和 RANGE

(1)BINS:上面的直方图显示输入图像中的每个像素值的像素数量,即从0到14。即需要14个值来显示上述的直方图(输入图像的像素等级为0-14)。但是并不是所有的图像的像素等级都为0-14,例如,大部分的灰度图像的像素等级为0-255,即一共有256个像素等级,如果需要找到位于0到15之间,然后是16到31,... ,240到255之间的像素值。你只需要16个值来表示直方图(即16×16=256)。这就是OpenCV中的BINS,只是将整个直方图拆分成16个子部分,每个子部分的值是其中所有像素数的总和。这个子部分被称为“BIN”,在OpenCV中,BINS由术语hitSize表示。

(2)DIMS: 表示维度,对灰度图像来说只有一个通道值dims=1

(3)RANGE:这是你要测量的强度值的范围。通常,它是[0,256],即所有强度值。

---------------------------------------------------------------------------------------------------------------------------------

二.直方图均衡化

过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。

直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。

实际的直方图均衡化很少能够得到完全平坦的直方图。在离散情况下,通常不能证明离散的直方图均衡化能得到均匀的直方图。尽管如此,均衡化有助于图像直方图的延展,均衡化后图像的灰度级范围更宽,有效地增强了图像的对比度。

--------------------------------------------------------------------------------------------------------------------------------?

输入图像的像素等级为0-255等级的情况如下,图像的像素总和为255,如下图所示。

将图像像素分为16个像素区间,每个区间包含16个像素,计算每组像素区间的像素数量,如下图所示。

-------------------------------------------------------------------------------------------------------------------------------

三.直方图均衡化的原理

接下来从数学的角度理解直方图均衡化的原理,假设待处理图像为灰度图像,r 表示待处理图像的灰度,取值范围为\left [ 0,L-1 \right ],则?r = 0?表示黑色,r = L - 1 表示白色,直方图均衡化的过程对应于一个变换T? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??s = T\left ( r \right ),0\leqslant r \leqslant L-1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??\left ( 1 \right )
也就是说,对于输入图像的某个灰度值r,可以通过变换公式T得到图像均衡化后的图像对应位置的灰度值s。其中变换T满足以下条件:

(a)? ??T(r)\left [ 0,L-1 \right ]上严格单调递增;
(b)? ? 当0\leq r\leq L-1时,T\left ( r \right )也要满足。

条件(a)中T\left ( r \right )严格单调递增是为了保证输出灰度值与输入灰度值一一对应,同时像素灰度值之间的相对大小关系不变,这样可以避免反变换时出现问题;条件(b)保证了输出图像的灰度范围与输入图像相同。实际中处理的图像通常是整数灰度值,必须把所有结果四舍五入为最接近的整数值。因此,当严格单调条件不满足时,使用寻找最接近整数匹配的方法解决反变换不唯一的问题。
?

图像均衡化推导

一幅灰度图像的灰度级可以看作区间\left [ 0 ,L-1 \right ]内的随机变量,因此可用其概率密度函数(PDF)描述。假设_{Pr\left ( r \right )}_{Ps\left ( s \right )}分别表示随机变量 r?和 s?的PDF,_{Pr\left ( r \right )}T已知 , 且_{Pr\left ( r \right )}在定义域内连续可微,则变换后 s?的PDF可由下式得到:
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?_{Ps\left ( s \right )} = _{Pr\left ( r \right )}\left | \frac{dr}{ds} \right |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)

此处用到了概率论中有关随机变量函数分布的相关定理:设\xi是连续型随机变量,其概率密度函数为p\left ( x \right ),又函数y = f\left ( x \right )严格单调,其反函数 h\left ( y\right )有连续导数,则\eta = f\left ( \xi \right )也是一个连续型随机变量,其概率密度函数为:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??\varphi \left ( y \right ) =\left\{\begin{matrix} & \\ p\left [ h\left ( y \right ) \right ]\cdot \left | {h}' \left ( y \right )\right |,\alpha < y< \beta & \\ 0, other & \end{matrix}\right.

其中? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\alpha = min\left \{ f\left ( -\infty \right ) ,f\left ( +\infty \right )\right \}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??\beta =max \left \{f\left ( -\infty \right ) ,f\left ( +\infty \right ) \right \}

由此看到,输出图像灰度 s的PDF就由输入图像灰度 r的PDF和变换 T?得到,图像处理中一个重要的变换函数构造如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??s = T\left ( r \right ) = \left ( L-1 \right )\int_{0}^{r}\left ( _{Pr\left ( w \right )} \right )dx? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3)
其中,w是形式积分变量,公式右边是随机变量r rr的累积分布函数(CDF),可以看到,(3)式完全满足前述的条件(a)和(b),为寻找变换后随机变量 s 的概率密度函数?_{Ps\left ( s \right )},由(2)式得
? ? ? ? ? ? ? ? ? ? ? ? ???? ?\frac{ds}{dr} = \frac{dT\left ( r \right )}{dr} = \left ( L-1 \right )\int_{0}^{r}\left ( _{P_{r}\left ( w \right )} \right )dw = \left ( L-1 \right )P_{r}\left ( r \right )? ? ? ? ? ? ? ? ? ?(4)

将(4)式代入(2)式得:

? ? ? ? ? ? ? ? ? ? ? ? ? ??P_{s}\left ( s \right ) = P_{r}(r)\left | \frac{dr}{ds} \right | = P_{r}\left ( r \right )\frac{1}{\left ( L-1 \right )P_{r}\left ( r \right )},0< s< L-1? ? ? ? ? ? ?(5)?

由(5)式可知,P_{s}\left ( s \right )为均匀分布,也就是说,输入图像的PDF经过(3)式中的变换 T?后得到的随机变量 s 服从均匀分布。
结论:图像均衡化变换 T\left ( r \right )?取决于P_{r}\left ( r \right ),但得到的 P_{s}\left ( s \right )始终是均匀的,与 P_{r}\left ( r \right )?的形式无关。对于离散形式,其推导过程与连续形式相似,用概率直方图和求和运算分别代替概率密度函数和积分运算,可得(3)式的离散形式:

? ? ? ? ? ? ? ? ? ? ? ? ??s_{k} = T\left ( r_{k} \right ) = \left ( L-1 \right )\sum_{j=0}^{k}P_{r}\left ( r_{j} \right ) = \frac{L-1}{MN}\sum_{j=0}^{k}n_{j},n = 1,2,3,......,L-1? ? ? ? ? ? ? ? ?(6)
假设一幅大小为 64 × 64? 像素的3比特图像\left ( L=8 \right )的灰度分布如下图所示,其中灰度级是范围\left [ 0,L-1 \right ] = \left [ 0,7 \right ]?中的整数。
?

? ? ? ?r_{k}n_{k}? ? ? ? ? ? ? ? ? ? ? ? ?p_{k}\left ( r_{k} \right ) =\frac{ n_{k}}{MN}
r_{0} = 0790? ? ? ? ? ? ? ? ? ? ? ? ? ?0.19
r_{1} = 11023? ? ? ? ? ? ? ? ? ? ? ? ? ?0.25
r_{2} = 2850? ? ? ? ? ? ? ? ? ? ? ? ? ?0.21
r_{3} = 3656? ? ? ? ? ? ? ? ? ? ? ? ? ?0.16
r_{4} = 4329? ? ? ? ? ? ? ? ? ? ? ? ? ?0.08
r_{5} = 5245? ? ? ? ? ? ? ? ? ? ? ? ? ?0.06
r_{6} = 6122? ? ? ? ? ? ? ? ? ? ? ? ? ?0.03
r_{7} = 781? ? ? ? ? ? ? ? ? ? ? ? ? ?0.02

则直方图均衡化的值可由 (6) 式计算得到:

? ? ? ? ? ? ? ? ? ? ? ? ???s_{0} = T_{r0} = 7\sum_{j=0}^{0}P_{r}\left ( r_{j} \right )=7P_{r}\left ( r_{0} \right )= 7\cdot 0.19 = 1.33

同理:? ?

? ? ? ? ?s_{1} = T_{r1} = 7\sum_{j=0}^{1}P_{r}\left ( r_{j} \right )=7P_{r}\left ( r_{0} \right )+7P_{r}\left ( r_{1} \right )= 7\cdot 0.19 +7\cdot 0.25= 3.08? ? ? ? ? ?以此类推计算求得所有 s_{k}值并将其近似为最接近的整数,结果如下:


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s_{0} = 1.33\approx 1,s_{1} = 3.08\approx 3

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s_{2} = 5.55\approx 5,s_{3} = 5.67\approx 6

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s_{4} = 6.23\approx 6,s_{5} = 6.65\approx 7

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s_{6} = 6.86\approx 7,s_{7} = 7.00\approx 7


?均衡化后的图像只有5个灰度级,r_{0}=0?被映射为 s_{0}=1,在均衡化后的图像中有790个像素取该值,有1023个像素取 s_{1}=3,有850个像素取?s_{2}=5,因为r_{3}r_{4}都被映射为有656+329=985个像素取6,同理,有245+122+81=448个像素取7。


因为直方图是PDF的近似,并且处理后不产生新的灰度级,所以在实际的直方图均衡化很少能够得到完全平坦的直方图。在离散情况下,通常不能证明离散的直方图均衡化能得到均匀的直方图。尽管如此,均衡化有助于图像直方图的延展,均衡化后图像的灰度级范围更宽,有效地增强了图像的对比度。同时,上述方法完全是“自动”的,仅利用输入图像的直方图信息,无需更多的参数。

直方图均衡化原理参考:直方图均衡化_schwein_van的博客-CSDN博客_直方图均衡化

---------------------------------------------------------------------------------------------------------------------------------

四.直方图均衡化API函数接口

void calcHist( 
              const Mat* images, int nimages,
              const int* channels, InputArray mask,
              OutputArray hist, int dims, const int* histSize,
              const float** ranges, bool uniform = true, bool accumulate = false
              );

该函数能够同时计算多个输入图像,多个通道,不同灰度范围的灰度直方图.
其参数如下:

  • images,输入图像的数组,这些图像要求大小相同,深度相同(CV_8U CV_16U CV_32F
  • nimages ,输入图像的个数
  • channels,要计算直方图的通道个数
  • mask,可选的掩码,不使用时可设为空。要和输入图像具有相同的大小,在进行直方图计算的时候,只会统计该掩码不为0的对应像素
  • hist,输出的直方图
  • dims,直方图的维度
  • histSize,直方图每个维度的大小
  • ranges,直方图每个维度要统计的灰度级的范围
  • uniform,是否进行归一化,默认为true
  • accumulate,累积标志,默认值为false。

---------------------------------------------------------------------------------------------------------------------------------

代码实现

#include"stdafx.h"
#include<opencv.hpp>
#include<iostream>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;

//绘制直方图,src为输入的图像,histImage为输出的直方图,name是输出直方图的窗口名称
void drawHistImg(Mat &src, Mat &histImage, string name)
{
	const int bins = 256;
	int hist_size[] = { bins };
	float range[] = { 0, 256 };
	const float* ranges[] = { range };
	MatND hist;
	int channels[] = { 0 };

	calcHist(&src, 1, channels, Mat(), hist, 1, hist_size, ranges, true, false);

	double maxValue;
	minMaxLoc(hist, 0, &maxValue, 0, 0);
	int scale = 1;
	int histHeight = 256;

	for (int i = 0; i < bins; i++)
	{
		float binValue = hist.at<float>(i);
		int height = cvRound(binValue*histHeight / maxValue);
		rectangle(histImage, Point(i*scale, histHeight), Point((i + 1)*scale, histHeight - height), Scalar(255));

		imshow(name, histImage);
	}
}

int main(void)
{
	Mat src, dst, image;
    src = imread("F:/photo/lp.jpg");
	if (!src.data)
		cout << "ERR";
	cvtColor(src, image, COLOR_RGB2GRAY);
	equalizeHist(image, dst);

	imshow("src", src);
	imshow("equalizeHist", dst);

	Mat srcHistImage = Mat::zeros(256, 256, CV_32F);
	Mat dstHistImage = Mat::zeros(256, 256, CV_32F);
	drawHistImg(src, srcHistImage, "srcHistImage");
	drawHistImg(dst, dstHistImage, "dstHistImage");

	waitKey(0);
	return 0;


}

---------------------------------------------------------------------------------------------------------------------------------

图像处理效果

灰度图和灰度直方图处理

?灰度图直方图和直方图变换效果,对灰度图进行处理后,改变了图像的灰度分布,增强动态范围偏小的图像的对比度。均衡化后图像的灰度级范围更宽,有效地增强了图像的对比度。

?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:12:01  更:2022-09-04 01:12:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 19:12:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计