直方图,又称质量分布图,是一种统计报告图。“巴巴拉”掉书袋之类的名词解释就不在这里费话了,直方图在程序上应该最直接的应该是图片处理。下面介绍下直方图在图片上的应用。html
RGBA, 三原色的颜色表示法。R:red(红色)、G:green(绿色)、B:blue(蓝色)、A:alpha(透明度),最大值为255,最小值为0。例如:rbga(0,0,0,1):黑色,透明度为1;rbga(255,0,0,1):红色,透明度为1。git
咱们能够利用程序提供的API轻松获取图片的每一个像素点的RGBA的值(canvas getImageData() 方法),获取RGBA值后,咱们又如何获得图片的亮度数据呢?github
亮度 = 0.299*R + 0.587*G + 0.114*B
获得图片的亮度数据后,咱们开始绘制图片的直方图:canvas
X轴:由上公式可知,亮度最大值为255,最小值为0,定X轴最大值为255,最小值为0,间隔为1。
Y轴:统计每一个亮度点出现的次数。ui
如今,图片亮度的直方图绘制完成。code
绘制完直方图后,一般会发现,直方图的亮度分布并不会一条平整的线,而直方图均衡化,最直观的做用,就是均匀分布,将这条线尽可能平整。htm
优势:实现对比度的加强。
缺点:变换后图像的灰度级减小,某些细节消失;某些图像,如直方图有高峰,经处理后对比度不天然的过度加强。图片
实现过程:图片处理
1. 亮度系数 = 当前亮度及小于当前亮度的总个数 / 亮度总个数 2. 均衡化后的亮度 = 亮度系数 * 当前亮度 当前亮度及小于当前亮度的总个数: 小于或等于X轴某点的Y值的总和 亮度总个数: Y值的总和
经过上面两步,修改每一个点的亮度值,咱们就能够获得直方图均衡化后的曲线图,进而改变图片。get
亮度直方图中有时亮度点会集中在某段区间,直方图拉伸会将亮度均拉伸到咱们想要的区域,是一种线性拉伸。
实现过程:
1. 肯定亮度直方图区间,得最小值min,最大值max。 2. 肯定拉伸的区间(0-255),通常取255,定为section。 3. 拉伸后的亮度 = section * ((当前亮度 - min) / (max - min))
以上能够获得每一个点的修正过的亮度值。
上面只是干巴巴的文字,你们有兴趣能够看到我在github上的demo示例。
直方图