前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Histogram 直方图

Histogram 直方图

原创
作者头像
vanguard
修改2020-03-06 14:43:35
1.2K0
修改2020-03-06 14:43:35
举报
文章被收录于专栏:vanguard

Histogram / 图像直方图 / 灰度直方图

# 一般解释

直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。

A histogram is a graphical representation that organizes a group of data points into user-specified ranges. It is similar in appearance to a bar graph. The histogram condenses a data series into an easily interpreted visual by taking many data points and grouping them into logical ranges or bins.

# 图像领域解释

Consider an image whose pixel values are confined to some specific range of values only. For eg, brighter image will have all pixels confined to high values. But a good image will have pixels from all regions of the image. So you need to stretch this histogram to either ends (as given in below image, from wikipedia) and that is what Histogram Equalization does (in simple words). This normally improves the contrast of the image.

图像直方图由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类。

还有就是数码相机或者Photoshop里的色阶和色调曲线针对的是曝光和通道的直方图。

# 直接理解

图像上每个点灰度或通道值的统计。

# 宏观意义

图像域到频率域,三维到二维, 特性到泛性…

# 应用举例

1 直方图均衡,利用一个变换函数将输入图像的灰度级映射到输出图像, 使输出图像各灰度级相对均匀分布。

2 图像的理解,结合轮廓形态学等可以快速实现分割等。

代码语言:python
代码运行次数:0
复制
# Observation in OpenCV
import cv2, numpy as np
from matplotlib import pyplot as plt
img = cv2.imread(‘a.jpeg’,cv2.IMREAD_GRAYSCALE) # 0
# opencv
cv2.calcHist([img], [0], None, [256], [0, 256])
plt.hist(img.ravel(), 256, [0, 256])
plt.show()
## numpy
# np.histogram(img.flatten(),256,[0,256])
# cdf = hist.cumsum()
# cdf_normalized = cdf * hist.max()/ cdf.max()
# plt.plot(cdf_normalized, color = 'b')
# plt.hist(img.flatten(),256,[0,256], color = 'r')
# plt.xlim([0,256])
# plt.legend(('cdf','histogram'), loc = 'upper left')
# plt.show()

然后直方图均衡,自适应均衡以及限制自适应均衡用得比较多。

代码语言:python
代码运行次数:0
复制
# Histograms Equalization in OpenCV
img = cv2.imread(‘a.jpeg’,0)
equ = cv2.equalizeHist(img)
cv2.imwrite('res.png',res)

CLAHE (Contrast Limited Adaptive Histogram Equalization)

代码语言:python
代码运行次数:0
复制
# import cv2, numpy as np
img = cv2.imread('a.jpeg',0)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv2.imwrite('clahe_2.jpeg',cl1)

CLAHE同普通的自适应直方图均衡不同的地方主要是其对比度限幅。这个特性也可以应用到全局直方图均衡化中,即构成所谓的限制对比度直方图均衡(CLHE),但这在实际中很少使用。在CLAHE中,对于每个小区域都必须使用对比度限幅。CLAHE主要是用来克服AHE的过度放大噪音的问题。

这主要是通过限制AHE算法的对比提高程度来达到的。在指定的像素值周边的对比度放大主要是由变换函数的斜度决定的。这个斜度和领域的累积直方图的斜度成比例。CLAHE通过在计算CDF前用预先定义的阈值来裁剪直方图以达到限制放大幅度的目的。这限制了CDF的斜度因此,也限制了变换函数的斜度。直方图被裁剪的值,也就是所谓的裁剪限幅,取决于直方图的分布因此也取决于领域大小的取值。

通常,直接忽略掉那些超出直方图裁剪限幅的部分是不好的,而应该将这些裁剪掉的部分均匀的分布到直方图的其他部分。如下图所示。

这个重分布的过程可能会导致那些倍裁剪掉的部分由重新超过了裁剪值(如上图的绿色部分所示)。如果这不是所希望的,可以不带使用重复不的过程指导这个超出的部分已经变得微不足道了。

也有通过插值加快计算速度,如上所述的直接的自适应直方图,不管是否带有对比度限制,都需要对图像中的每个像素计算器领域直方图以及对应的变换函数,这使得算法及其耗时。

而插值使得上述算法效率上有极大的提升,并且质量上没有下降。首先,将图像均匀分成等份矩形大小,如下图的右侧部分所示(8行8列64个块是常用的选择)。然后计算个块的直方图、CDF以及对应的变换函数。这个变换函数对于块的中心像素(下图左侧部分的黑色小方块)是完全符合原始定义的。而其他的像素通过哪些于其临近的四个块的变换函数插值获取。位于图中蓝色阴影部分的像素采用双线性查插值,而位于便于边缘的(绿色阴影)部分采用线性插值,角点处(红色阴影处)直接使用块所在的变换函数。

这样的过程极大的降低了变换函数需要计算的次数,只是增加了一些双线性插值的计算量。

# 主要难点

观察值的计算和分析,结合其他通用算法的泛性分析方法。

低维对高纬的观察瓶颈,不可逆,不一定能代表问题主因。

文章内容有参考很多网上公开资料,主要百度百科和OpenCV以及CSDN博客,可能有误,仅供学习研究参考。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档