直⽅图均衡化取整怎么计算_数字图像处理之直⽅图均衡化
如果我不是我
讲解直⽅图均衡化之前,先解释⼀下图像的统计直⽅图与累加概率。
1. 统计直⽅图,就是统计图像中每⼀个像素值的个数。⽐如对于8位的图像,每⼀个像素点的像素值取值范围是0~255,那么其统计直⽅图
就是统计0~255中所有像素值在图像中的个数,⽐如0像素值有⼏个点、1像素值有⼏个点、2像素值有⼏个点......像素255有⼏个点,如下
图所⽰:双子女和白羊男
老汤怎么熬制2. 像素的概率,也就是该像素值的统计直⽅图值(像素数)除以图像的总像素数,假设像素x的统计直⽅图
值为hist(x),图像的总像素数为
size,那么该像素的概率为:
像素值x的累加概率,就是所有⼩于等于x的像素值的像素数,除以图像的总像素数,可按下式计算:日内交易
3. 接下来讲解直⽅图均衡化的原理。通常认为,图像的统计直⽅图分布越均匀,图像的质量越好,直⽅图均衡化可以提升图像的对⽐度和质
量。⽐如有的图像整体较暗,那么说明其直⽅图中低像素值分布较多,⾼像素值分布较少,这时可以使⽤直⽅图均衡化来平衡其直⽅图分
布,即减少低像素值,增加⾼像素值。从直观上看,均衡化的效果就是图像的部分区域相对原来变亮了,所以提升了图像的对⽐度。
直⽅图均衡化就是⼀个所有像素值重映射的过程。⽐如像素值x的直⽅图均衡化之后的值可按下式计算,其中n为图像的每⼀个像素点的位
宽,对于灰度图通常n=8,P(x)为像素值x的累加概率。
使⽤C++实现上述算法:
void my_equalizeHist(Mat src, Mat &dst){ dst = Mat::zeros(src.size(), CV_8UC1); float hist_tmp[256] = {0.0}; for(int i = 0; i < ws; i++) { uchar *p = src.ptr(
运⾏上述代码,对Lena图像进⾏直⽅图均衡化,结果如下,可以看到直⽅图均衡化之后,图像对⽐度增强了,统计直⽅图分布也更加均
匀。
蒸饺原图
直⽅图均衡化之后图像
原图的统计直⽅图
曾巩简介直⽅图均衡化之后的统计直⽅图
4. 观察上⽅H(x)的计算公式,P(x)的取值范围是0~1,H(x)与P(x)具有线性关系。为了进⼀步提升图像对⽐度,可以对P(x)作⼀个⾮线性
的S型变换T(P(x)),并保证变换之后T(P(x))的取值范围还在0~1之间。本⽂分别构造了T1和T2这两个⾮线性函数⽤于⾮线性变换,同时我
们可以把原本H(x)与P(x)的线性关系看成函数T0,于是有以下三种变换:
画出以上三种变换函数在0~1区间的曲线如下图所⽰,可以看到T1和T2的曲线都是S型。
从⽽H(x)与P(x)有三种映射关系:
增加⾮线性变换的代码实现与上述代码⼤同⼩异:
右先生
#define PI 3.14159inline float T1(float x){ return (0.5*(sin(PI*x-PI/2)+1));}inline float T2(float x){ float xx = 3 - x*6; return (1.0/(1+exp(xx)));}void my_equalizeHist(分别选择 T 0、 T 1 和 T 2变换,运⾏以上代码,得到的结果如下,可以看到使⽤ T 1 和 T 2变换得到结果的对⽐度相对于 T 0有所提⾼。
T0
三大批判
T1
T2
5. 上述直⽅图均衡算法还存在⼀个问题,就是当图像的0像素值占很⼤⽐例时,从起始的0像素值的累加概率就很⼤了,导致后⾯的1~255像素值的累加概率均变得很⼤,从⽽造成直⽅图均衡化之后的像素值都偏⼤。⽐如下图,可以看到直⽅图均衡化之后图像变⽩了,严重失真。
原图