直方图

前言

直方图,又称质量分布图,是一种统计报告图。“巴巴拉”掉书袋之类的名词解释就不在这里费话了,直方图在程序上应该最直接的应该是图片处理。下面介绍下直方图在图片上的应用。

1. 图片亮度直方图绘制

RGBA, 三原色的颜色表示法。R:red(红色)、G:green(绿色)、B:blue(蓝色)、A:alpha(透明度),最大值为255,最小值为0。例如:rbga(0,0,0,1):黑色,透明度为1;rbga(255,0,0,1):红色,透明度为1。

我们可以利用程序提供的API轻松获取图片的每个像素点的RGBA的值(canvas getImageData() 方法),获取RGBA值后,我们又如何得到图片的亮度数据呢?

亮度 = 0.299*R + 0.587*G + 0.114*B 

得到图片的亮度数据后,我们开始绘制图片的直方图:

X轴:由上公式可知,亮度最大值为255,最小值为0,定X轴最大值为255,最小值为0,间隔为1。
Y轴:统计每个亮度点出现的次数。

现在,图片亮度的直方图绘制完成。

2. 直方图均衡化

绘制完直方图后,通常会发现,直方图的亮度分布并不会一条平整的线,而直方图均衡化,最直观的作用,就是均匀分布,将这条线尽量平整。

优点:实现对比度的增强。
缺点:变换后图像的灰度级减少,某些细节消失;某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。

实现过程:

1. 亮度系数 = 当前亮度及小于当前亮度的总个数 / 亮度总个数
2. 均衡化后的亮度 = 亮度系数 * 当前亮度

当前亮度及小于当前亮度的总个数: 小于或等于X轴某点的Y值的总和
亮度总个数: Y值的总和

通过上面两步,修改每个点的亮度值,我们就可以得到直方图均衡化后的曲线图,进而改变图片。

3. 直方图拉伸

亮度直方图中有时亮度点会集中在某段区间,直方图拉伸会将亮度均拉伸到我们想要的区域,是一种线性拉伸。

实现过程:

1. 确定亮度直方图区间,得最小值min,最大值max。
2. 确定拉伸的区间(0-255),一般取255,定为section。
3. 拉伸后的亮度 = section * ((当前亮度 - min) / (max - min))

以上可以得到每个点的修正过的亮度值。

结尾

上面只是干巴巴的文字,大家有兴趣可以看到我在github上的demo示例。
直方图

你可能感兴趣的:(直方图)