专栏首页readmeHistogram 直方图
原创

Histogram 直方图

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 图像的理解,结合轮廓形态学等可以快速实现分割等。

# 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()

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

# 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)

# 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博客,可能有误,仅供学习研究参考。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Color model 色彩模型

    A color model is a system for creating a full range of colours from a small set ...

    readme
  • AEAD 认证加密

    AEAD stands for Authenticated Encryption with Associated Data. AEAD ciphers simu...

    readme
  • PI 圆周率

    3.141592653589793238462643383279502884197169399375105820974944592307816406286208...

    readme
  • 腾讯多媒体实验室亮相首届世界5G大会,展现5G+多媒体前沿研究成果

    11月20-23日,由北京市政府、国家发改委、科技部、工信部共同主办的首届“世界5G大会”在北京举办,全球信息通信领域最具影响力的科学家、世界知名5G上下游企...

    腾讯音视频实验室
  • 解决mac升级10.11后,出现的 xcrun: error: invalid active developer path, missing xcrun 错误

    前天把小mac升级到了10.11,结果今天在终端里使用git的时候,弹出一行莫名其妙的错误:xcrun: error: invalid active devel...

    Allen Cheng
  • 面试官很牛,逼我尿遁

    今天等来了久违的面试。在我的印象里,面试就是要面对面的。因为疫情的缘故,过去几周我经历了太多的视频和电话面试,总是凉凉。想到一本正经的面试官,下半身可能藏在被子...

    xjjdog
  • 保证service存活

    Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,i...

    xiangzhihong
  • 【LeetCode】最小栈

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

    Delevin
  • PLC使用过程中的经验和技巧

    随着社会的发展,plc可编程序控制器在工业生产中得到了广泛的使用,但是其维护检修方法和技巧,很多工程师都不得法,下面为您介绍PLC使用过程的经验和技巧。 1、P...

    机器人网
  • [Java 进阶]异常

    异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。 世上没有百分之百完美的程序。程序总难免存在各式各样的问题。所以,程序中添加对于错...

    静默虚空

扫码关注云+社区

领取腾讯云代金券