【OpenCV图像处理】十、图像的直方图及相关处理(上)

直方图是数字图像处理中的一个重要的基础工具,在讨论各种空域图像处理之前,首先要十分清楚直方图的概念以及它的表示的意义。

直方图提供了图像的统计信息,为了理解多种空域增强技术的内涵提供了铺垫。此外,利用直方图操作也可以直接用于图像增强。目前大多数数字照相机都有显示所拍摄照片直方图的功能,直方图可以显示出整张照片的灰度分布情况,可以根据直方图所示的灰度分布判断图像曝光是否恰当,有助于拍摄前的各种参数中设置,如感光度、光圈、快门速度和曝光时间等。

1.灰度直方图

直方图是数字图像的统计表征量。对于一幅灰度图像,灰度直方图反映了图像中不同灰度像素出现的统计情况,描述了像素灰度的分布情况。数字图像的灰度直方图是一个一维离散函数,定义为


其中,rk表示第k个灰度级,nk表示灰度值为rk的像素在图像中出现的频数,L表示灰度级数。

在一幅图像中,灰度值为rk的像素出现的频数与像素总数的比值,称为“概率直方图”,可以表示为:


式中,n为图像中的像素总数,等号坐标实际上表示灰度级rk的概率分布。因此,在概率直方图中,所有灰度级的概率之和等于1.

图像的直方图的两个性质:

1.直方图表示一幅图像中不同灰度像素出现的统计信息,它只能反映该图像中不同灰度值出现的频数(概率),而不能表示出像素的位置等其他信息。

2.图像与直方图之间是多对一的映射关系,也就是说,不同的图像可能对应同一幅灰度直方图。

图像直方图在数字图像处理中的三个方面的应用:

a.直方图可以用于判断一幅图像是否合理的利用了全部可能的灰度级。直观上来说,如果一幅图像的像素值充分占有整个灰度级范围并且分布比较均匀,则这样的图像具有高对比度和多灰度阶。通过检查灰度直方图,可以确定设备参数调整方向,或者灰度级变换规则,如伽玛校正。

b.图像的视觉效果与其直方图之间存在对应关系,改变直方图的形状对图像产生对应的影响。通过直方图可以推断出图像的一些性质:明亮图像的直方图倾向于灰度级高的一侧,灰暗图像的直方图倾向于灰度级低的一侧;低对比度图像的直方图集中于灰度级中很窄的范围,高对比度图像的直方图覆盖的灰度级很宽而且像素的分布比较均匀。因此,通过处理直方图可以起到图像增强的作用。

c.利用直方图可以在图像分割中确定合适的阈值,并且能够根据直方图区域对像素进行统计。

2.累积直方图

累积直方图实际上就是概率直方图p(rk)关于灰度级rk的累积概率分布,定义为:


其中,rk表示第k个灰度级,nk为频数,n为总数,c(rk)表示灰度值落在区间[0,rk]内的像素在图像中出现的总概率,L表示灰度级数。需要注意的是,累积直方图一定是递增的(不一定严格递增),且第L个灰度级的累积概率值一定等于1.

3.彩色图像的分量直方图

上面说的直方图都是针对灰度图像而言的,下面主要来考虑一下彩色图像的情况。因为在彩色图像中,每个像素的颜色是有3个分量数值组成的一个向量。因此所谓的彩色图像的直方图,其实是对图像中所有像素的R,G,B分量分别统计得到的3个分量的直方图。3个分量的黑白印刷效果实际上就是3个灰度图像,下面考虑如何将一幅彩色图像转换成为灰度图像的方法。

如果直接分别提取R,G,B三个分量中的一个分量作为结果图像的灰度,其他两个分量在置为与选定分量同等大小的值,这就类似于黑白印刷的效果。但是这种方式处理有相应缺点,显示效果并不是十分理想,毕竟其中的两个分量被忽略掉了,而它们对于最终的显示效果也有贡献。因此一般会采用下面的方法,大致有3种。

a.平均值法:

每个像素的三原色值等于红绿蓝3个分量的平均值,这样一来,结果图像中的像素值构成也就均匀的考虑到了3个分量的影响,公式可以表示为:


b.最大值法:

每个像素的三原色值等于红绿蓝3个颜色的最大值,公式为:


c.加权平均值法:

加权平均值法中给予红绿蓝3个分量不同的权值,然后进行相加,公式如下:


人眼对于三原色的敏感程度从高到低分别是绿、红、蓝,所以三原色权值的取值关系应该是WG>WR>WB,由YUV颜色空间可知,当R=G=B=0.299R+0.587G+0.114B时,能够得到最合适的灰度图像。

4.直方图处理:

直方图处理也是一种点处理方法,它通过对灰度直方图进行变换有效的实现图像增强。直方图处理主要有直方图均衡化直方图规定化两种方法。直方图均衡化是通过灰度级变换将输入图像变换为具有均匀分布直方图的图像。更一般的情况,直方图规定化是指通过灰度级变换将输入图像转换为具有特定分布直方图的图像。

a.基础理论

直方图处理的作用是通过是直方图服从均匀分部或者其他特定的函数形式,从而扩展灰度级的动态范围。提高图像的对比度、增强局部细节等等。

设r表示输入图像的灰度级,概率分布率为Pr(r),s表示输出图像的灰度级,其概率分布律为Ps(s),其中0<=r,s<=1,直方图处理就是选取灰度级变换函数,使得

s = T(r)

式中,T(r)为变换函数,T(r)的选取应该满足下面的条件:

(1).T(r)在区间0 <= r <= 1内为严格单调递增函数

(2).对于0 <= r <=1,有0 <= T(r) <=1

第1个条件保证了灰度级从暗到亮的次序不变,并且保证了反函数的存在;第二个条件保证了输出灰度级与输入灰度级具有相同的灰度级范围。满足上述条件的反函数表示为:

r = T^(-1)(s)

反函数同样满足上述的两个条件。

b.直方图均衡化

当直方图中像素值集中在狭窄的灰度级范围内或分布极不均匀时,图像呈现较差的对比度。由于一幅适当对比度图像的直方图具有较宽的灰度级范围,且分布较为平坦,

直方图均衡化的目的是将直方图的灰度级概率分布变换为均匀分布。

对于L个灰度级的数字图像,直方图均衡化后的概率分布率做不到完全服从均匀分布。设第k个灰度级为rk,具有灰度值rk的像素数为nk,像素总数为n,直方图均衡化的具体可执行的步骤如下:

(1).计算输入图像灰度级rk的概率分布律Pr(rk),统计各灰度级rk的像素出现的概率为:


 (2).计算输入图像灰度级rk的累积概率分布率Fr(rk):

(3).确定输入灰度级与输出灰度级之间的映射关系rk→sk,将输入图像中的rk映射到输出图像中灰度级为sk的对应像素中

(4).统计输出图像各灰度级sk的像素数,并计算输出图像灰度级sk的概率分布率Ps(sk)。

需要注意的是,在灰度级为离散形式时,灰度级映射后的灰度值sk一般并非落在量化的灰度级上,因此将灰度值sk近似为最接近的量化灰度级sk。因此直方图中的同一灰度级的像素不能拆分,而不同灰度级的像素通常会发生合并,因此,造成所使用的灰度级数减少,从而造成细节信息的丢失

最后需要说明,直方图均衡化的目的是一幅图像的像素值占有全部可能的灰度级且分布的尽可能均匀,尽管能够从视觉效果上提高图像的对比度,但是,由于直方图中概率较小的灰度级合并为更少的几个或一个灰度范围内,从而降低了图像的灰度分辨率,且某些细节信息处于概率较小的灰度级中,这样的灰度级归并到其他灰度级中,从而造成图像细节信息的丢失。

因此,已有的研究表明,一种好的图像增强(复原)的算法应该使得处理后图像的直方图与源图像的直方图在总体形状上保持一致。因此,直方图均衡化的主要问题是造成了直方图的形状发生了失真,从而使得处理后的图像看起来缺乏真实性和自然性。

b.直方图规定化

上面介绍的直方图均衡化能够增强图像的对比度,然而却无法控制具体的增强效果,更一般的情况是要求图像具有特定的直方图,以便于有选择的对图像中某个特定的灰度级范围进行增强,或使其满足后续处理的特定需求。

直方图规定划的目的是是将具有一直直方图的图像变换为具有某种特定形状直方图或者用户交互指定形状直方图的图像,因而也称为“直方图匹配”

可以看出,直方图均匀化是直方图规定化的特例,因为它将输入图像的直方图变换为服从均匀分布的直方图

对于数字图像,由于直方图是离散化的,不同灰度级的像素可以合并,同一灰度级的像素不能拆分,因此,不同的映射关系,会产生不同的规定化结果。设数字图像具有L个灰度级,输入图像的灰度级为rk,具有灰度值rk的像素数为nk,直方图规定划具体可执行步骤大致如下:

(1).对输入图像的概率直方图Pr(rk)进行直方图均衡化,也就是计算Pr(rk)的累积直方图


(2).对规定直方图Pv(vj)进行直方图均衡化,即计算规定化累积直方图:


(3).根据前向映射sk→vt或者向后映射vt→sk临近原则将输入灰度级映射到新的灰度级,也就是寻找k和l满足条件:

(4).确定输入灰度级与输出灰度级之间的映射关系rk→vk,将输入图像中灰度级为rk的像素映射到输出图像中灰度级为vk的对应像素。

(5).统计输出图像各灰度级vk的像素个数,并计算输出图像的概率直方图。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在计算机视觉和图像处理直方图是一个非常重要的概念,它可以帮助我们更好地理解和处理图像。在 OpenCV ,可以使用函数 `calcHist()` 来计算图像直方图,该函数接收的参数包括图像、通道数、直方图尺寸、像素值范围等。具体的操作流程如下: 1. 读取图像并转换为灰度图像 2. 定义直方图的参数,包括通道数、直方图尺寸和像素值范围等 3. 计算直方图 4. 绘制直方图 下面是一个简单的代码示例: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像并转换为灰度图像 Mat srcImage = imread("lena.jpg", IMREAD_GRAYSCALE); // 定义直方图的参数 int histSize[] = { 256 }; float range[] = { 0, 256 }; const float* histRange[] = { range }; int channels[] = { 0 }; // 计算直方图 Mat hist; calcHist(&srcImage, 1, channels, Mat(), hist, 1, histSize, histRange); // 绘制直方图 int hist_w = 512, hist_h = 400; int bin_w = cvRound((double)hist_w / histSize); Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0)); normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); for (int i = 1; i < histSize[0]; i++) { line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(hist.at<float>(i - 1))), Point(bin_w*(i), hist_h - cvRound(hist.at<float>(i))), Scalar(255), 2, LINE_AA); } // 显示原始图像直方图 namedWindow("Source Image", WINDOW_AUTOSIZE); imshow("Source Image", srcImage); namedWindow("Histogram", WINDOW_AUTOSIZE); imshow("Histogram", histImage); waitKey(0); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值