直方图及其应用

这篇具有很好参考价值的文章主要介绍了直方图及其应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

直方图定义

直方图是一种描述数据的分布

通过将连续变量划分成一系列区间,统计区间频率,并用来表示,以表征其统计特征

在图像处理中,直方图可以用来表示图像中像素值的分布状况,描述不同灰度级的像素在图像中的占比

直方图及其应用

直方图应用

1. 图像增强。通过调整像素值,让图像的像素复合某种统计特性,达到增强图像的目的

2. 图像分割。利用直方图来将图像划分为多个区域,从而进行目标分割

3. 像素的统计特性,可以作为图像的一种特征,用于对图像内容进行分类、检索、压缩

https://blog.csdn.net/yishuihanq/article/details/120220374

直方图及其应用

OpenCV画直方图

  1. cv2.calcHist(images,channels,mask,histSize,ranges)

关于`cv2.calcHist`函数的说明

hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)

- images: 源图像

- channels:参与计算直方图的通道

- mask:一个可选的掩膜,它与源图像具有相同的尺寸,用于指定计算直方图的区域。例如,可以通过指定一个矩形来计算图像的某个区域的直方图。

- histSize:表示要计算的直方图的大小以方括号形式传入。如果输入图像是灰度图像,则为灰度级别数;如果是彩色图像,则可以对每个通道指定不同的大小,例如 [256, 256, 256] 表示每个通道的直方图大小为 256。

- ranges:表示像素值的范围,以方括号形式传入。如果输入图像是灰度图像,则范围应该是 [0, 256];如果是彩色图像,则可以为每个通道指定不同的范围,例如 [0, 256, 0, 256, 0, 256] 表示每个通道的范围分别为 [0, 256]。

- accmulate:一个可选的参数,用于指定是否要累加直方图。如果指定为 True,则计算整幅图像的直方图;如果指定为 False,则只计算当前区域的直方图。

2. (numpy)np.histagram

关于np.histagram的用法:

hist, bins = np.histogram(a, bins=10, range=None, normed=False, weights=None, density=None)

- a: 输入的一维数组。

- bins: 直方图的bin数量,也可以指定每个bin的边界,如[0, 10, 20, 30, 40]。

- range: 直方图统计的范围。

- normed和density:两个参数效果相同,设置是否对结果进行归一化。

对比度增强

对比度:最暗的像素和最大的像素值的对比

直方图及其应用

一个经典的对比度增强的方法:对比度拉伸,局限:仅适用于低动态图像

https://blog.csdn.net/xinjay1992/article/details/108672007

直方图及其应用
直方图及其应用

直方图均衡化

直方图最广泛的应用之一,就是直方图均衡化。

直方图均衡化,是一种对**图像增强**的方法:通过重新分配像素值的灰度级,来增强图像的对比度

对于矩阵的意义:让像素在整个像素范围更加均匀

基本思想

将直方图变换为一个均匀分布的直方图,使得像素值更加均匀,从而达到增强图像的目的。

通常,直方图中呈现尖峰的位置,说明处于该值的像素较为接近

而直方图均衡化后,可以令这些像素取值更加分散,因此视觉上可以将不明显的物体与周围物体区分开来

计算过程

https://blog.csdn.net/weixin_45930877/article/details/119581282

直方图性质等详解:https://zhuanlan.zhihu.com/p/411042641

底层代码

np.interp 是 NumPy 中的一个函数,用于进行线性插值。具体来说,

np.interp(x, xp, fp, left=None, right=None, period=None) 函数用于计算一个新的数组 x 对应的线性插值结果。其中,x 表示需要进行插值的位置,xp 表示已知数据的位置,fp 表示已知数据的取值。

具体地说,np.interp 的计算方式为:对于 x 中的每一个位置,找到其在 xp 中的相邻位置 xp_i 和 xp_{i+1},然后在这两个位置的 fp 取值中进行线性插值,得到 x 对应位置的插值结果。

如果 x 中的某个位置超出了 xp 的取值范围,那么根据参数 left 和 right 的取值,有不同的处理方式。如果 left 和 right 都未指定,那么超出取值范围的位置将返回 np.nan;如果 left 和 right 中的一个指定了值,那么超出取值范围的位置将使用该值进行插值;如果两者都指定了值,那么会根据超出位置的方向分别使用两个值进行插值。

此外,如果 xp 中的值不是单调递增的,那么可以使用参数 period 指定数据的周期,从而进行周期性插值。

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 先把图像变暗
img = cv2.imread('E:/notebook/lena.png', 0)
plt.imshow(img, cmap='gray')
plt.show()
dark = (0.5 * img).astype('uint8')
# cv2.imwrite("E:/notebook/dark_lena.jpg", dark)
image = cv2.imread("E:/notebook./dark_lena.jpg")
plt.imshow(image, cmap='gray')
plt.show()
# 计算直方图
hist, bins = np.histogram(img.flatten(), 256, [0,256])
plt.hist(hist, bins=bins)
plt.show()
print(hist[100:105])
# [1950 1950 1881 1862 1683]
# 直方图归一化
hist_norm = hist.astype(np.float32) / hist.sum()
print(hist_norm[100:105])
# [0.00743866 0.00743866 0.00717545 0.00710297 0.00642014]
# 计算累积直方图
cum_hist = hist_norm.copy()
for i in range(1, len(cum_hist)):
    cum_hist[i] = cum_hist[i-1] + cum_hist[i]
print(cum_hist[100:105])
# [0.32024384 0.3276825  0.33485794 0.34196091 0.34838104]
# 均衡化
img_equalized = np.interp(img.flatten(), bins[:-1], cum_hist).reshape(img.shape)
# print(bins)
plt.imshow(img_equalized, cmap='gray')
plt.show()
直方图及其应用
直方图及其应用
直方图及其应用
直方图及其应用

缺点

直方图整体均衡化用于增强图像质量。通过将图像映射到小区间,并进行归一化,使得其像素范围能够充斥整个空间。从而达到增强图像对比度,或者将亮度调整到适宜空间内的效果。

然而,对图像总体进行直方图均衡化,也会造成一些负面效果。

* 图像中某部分很亮,其他部分很暗,直方图均衡化会导致亮部过曝

直方图及其应用

* 图像分层

直方图及其应用

* 噪声问题

直方图及其应用

自适应直方图均衡(AHE, adaptive histogram equalization)

将图像分成若干的各区域对每个小区域做直方图均衡化

def AHE(im, wsz=100):
    h, w = im.shape
    out = np.zeros(im.shape) # Declare output variable
    for x in range(wsz//2, h + wsz//2):
        for y in range(wsz//2, w + wsz//2):
            blk = im[x-wsz//2:x+wsz//2, y-wsz//2:y+wsz//2]
            tmp = cv2.equalizeHist(blk)
            out[x-wsz//2:x+wsz//2, y-wsz//2:y+wsz//2] = tmp
    return out
img = cv2.imread("E:/notebook/person.png", 0)
plt.imshow(img, cmap="gray")
plt.show()
img = AHE(cv2.imread("E:/notebook/person.png", 0), wsz=50)
plt.imshow(img, cmap="gray")
plt.show()
直方图及其应用
直方图及其应用

CLAHE (contrast limited adaptive histogram equalization)

**核心思想** 将图像划分为若干个小块,并在小块内进行限制性直方图均衡化,经双线性最后的均衡化后的图像。

**步骤**

1. 将图像划分成若干个大小相等的块

2. 对每个子图进行“限制性”均衡化

3. 插值,得到均衡化后的像素值

“限制性”均衡化

**参数解释**

`clipLimit`: 控制了直方图均衡化中对比度增强的程度。该参数的数值越大,对比度增强的程度也越大,但是同时也会增加图像出现伪影的概率。

clip_limit = clip_limit_factor * (M / N)

其中,clip_limit_factor是一个用户定义的参数,通常取值在0.01到0.1之间;M是图像像素数量,N是直方图中的最高峰的数量。通常情况下,N的取值在50到200之间。

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
clip_limit = 5
arr_clipped = np.clip(arr, a_min=None, a_max=clip_limit)
print(arr_clipped)
# [1 2 3 4 5 5 5 5 5]

平滑伪影

`tileGridSize` 表示将图像分割成的小块的大小。它对均衡化结果的影响主要体现在以下两个方面:

* 计算直方图时的像素点数量:由于 CLAHE 算法是在每个小块上进行直方图均衡化,因此 tileGridSize 的大小会直接影响每个小块中包含的像素点数量。如果 tileGridSize 太小,每个小块中的像素点数量就会很少,可能会导致直方图统计不准确,从而影响均衡化结果。而如果 tileGridSize 太大,每个小块中的像素点数量就会很多,可能会导致直方图过于集中,也会影响均衡化结果。因此,要根据具体的图像特征和处理需求,选择适当的 tileGridSize 大小。

* 均衡化效果的细节保留:tileGridSize 的大小还会影响均衡化结果中细节的保留程度。如果 tileGridSize 太小,每个小块中的像素点数量较少,可能会导致细节的损失。而如果 tileGridSize 太大,每个小块中的像素点数量较多,可能会导致一些小细节被平滑掉,从而导致细节不够清晰。因此,要根据具体的需求和图像特征,选择适当的 tileGridSize 大小,以达到最优的均衡化效果和细节保留程度。

cl = cv2.createCLAHE(clipLimit=3, tileGridSize=(8, 8))
im = cl.apply(cv2.imread("E:/notebook/person.png", 0))
plt.imshow(im, cmap='gray')
plt.show()
直方图及其应用

直方图应用---图像分割

直方图的波动曲线,表示了不同像素等级的统计信息

对于一个语义上关联较为紧密的物体,其像素的关联可能也较为紧密

因此,在对某个高频像素进行处理的时候,往往也是对于语义关联较为紧密的物体进行处理

最优阈值怎么选?

img = cv2.imread('E:/notebook/greenscreen.png')
plt.imshow(img)
plt.show()
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
print(hist)
plt.bar(range(256), hist.ravel())
plt.show()
max_peak = np.argmax(hist)
print(max_peak) # 最多的43阈值1
second_peak = np.argmin(hist[100: 150]) + 100
print(second_peak) # 第二多的119阈值2
# 区间1 [0: max]
img_bin = np.zeros_like(img)
img_bin = np.where((img >= max_peak), 255, img_bin)[:, :, 0]
plt.imshow(img_bin, cmap='gray')
plt.show()
img_bin_2 = np.ones_like(img) * 0
img_bin_2 = np.where((img <= second_peak), 255, img_bin_2)[:, :, 0]
plt.imshow(img_bin_2, cmap='gray')
plt.show()
mask = img_bin * img_bin_2
plt.imshow(mask, cmap='gray')
plt.show()
直方图及其应用

[ 4453 8 45 52 136 241 268 419 321 185

125 146 146 151 149 168 178 251 253 323

375 475 584 1422 6139 48787 56813 54050 46046 43175

44371 46881 50671 58219 67125 74001 79400 86139 94594 101315

106251 109673 111434 112107 108057 98107 82611 64185 45954 32076

21640 15553 11695 9372 7469 6331 5179 4293 4001 4069

4792 6236 7699 8896 9643 10292 10823 11433 11818 11658

11690 11837 11720 10725 9846 8624 8447 8868 9864 11090

12556 13322 14375 14455 14782 15375 16505 18185 20749 23972

27871 32725 37063 40653 43648 46654 50872 55540 60205 64409

68385 71674 73997 71533 64290 54777 45432 38829 34013 27982

19619 11758 5682 2464 1106 706 514 488 441 417

438 421 431 444 427 437 465 474 555 690

1209 2081 3344 4898 6402 7349 7833 7570 7398 7632

7893 8051 8164 8724 10058 10658 10922 10622 9631 8468

7228 6841 7235 7717 8257 8614 8938 9540 10613 11682

12396 12713 13697 14371 14911 16181 17299 19732 21809 24816

27204 29519 32065 37209 41996 45069 46880 49048 51798 53681

54753 57345 63271 69282 69754 65532 56153 46119 39935 33199

23103 10697 3033 681 246 182 183 124 108 104

86 100 81 95 73 84 79 86 81 73

81 106 119 131 119 125 113 124 128 132

142 126 157 133 129 142 181 169 183 140

100 82 100 93 107 150 169 182 145 195

250 318 440 511 573 544 426 427 376 354

276 230 161 115 110 95]文章来源地址https://www.toymoban.com/news/detail-502331.html

直方图及其应用
直方图及其应用
直方图及其应用
直方图及其应用

到了这里,关于直方图及其应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv进阶01-直方图的应用及示例cv2.calcHist()

    直方图是一种图形表示方法,用于显示数据中各个数值或数值范围的分布情况。它将数据划分为一系列的区间(也称为“箱子”或“bin”),然后统计每个区间中数据出现的频次(或频率)。直方图可以帮助我们更好地理解数据的分布特征,包括集中趋势、离散程度等。 直方

    2024年02月13日
    浏览(49)
  • 【opencv】示例-demhist.cpp 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。...

    这段代码是使用C++和OpenCV库编写的图像处理程序,其主要功能是 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。 用户可以通过界面上的滑动条来动态地调整亮度和对比度参数从而观察到图像即时的变化效果。程序首先读取并显示一个灰度图像

    2024年04月10日
    浏览(49)
  • Python可视化在量化交易中的应用(13)_Seaborn直方图

    seaborn中绘制直方图使用的是sns.histlot()函数: sns.histplot(data,x,y,hue,weights,stat=‘count’,bins=‘auto’,binwidth,binrange,discrete,cumulative,common_bins,common_norm,multiple=‘layer’,element=‘bars’,fill,shrink=1,kde,kde_kws,line_kws,thresh=0,pthresh,pmax,cbar,cbar_ax,cbar_kws,palette,hue_order,hue_norm,color,log_scale,legend,ax

    2024年02月12日
    浏览(48)
  • OpenCV10-图像直方图:直方图绘制、直方图归一化、直方图比较、直方图均衡化、直方图规定化、直方图反射投影

    图像直方图就是统计图像中每个灰度值的个数,之后将灰度值作为横轴,以灰度值个数或者灰度值所占比率作为纵轴的统计图。通过直方图,可以看出图像中哪些灰度值数目较多,哪些较少,可以通过一定的方法将灰度值较为集中的区域映射到较为稀疏的区域,从而使图像在

    2024年01月16日
    浏览(53)
  • FPGA图像处理与直方图均衡化的综合应用:理论支撑、仿真波形与详细代码

    FPGA直方图均衡化 直方图拉伸 FPGA图像处理 工程和算法包含以下内容: 1,MATLAB中实现图像处理。 2,verilog代码利用MATLAB联合modelsim仿真实现的图像处理。 3,小梅哥AC620和正点原子新起点 开拓者的FPGA板卡上实现的图像处理。 4,效果展示。 有理论支撑,有仿真波形,有详细代

    2024年04月27日
    浏览(38)
  • 【OpenCV • c++】直方图计算 | 绘制 H-S 直方图 | 绘制一维直方图 | 绘制 RGB 三色直方图

      直方图广泛应用于很多计算机视觉处理当中。通过标记帧与帧之间显著的边缘和颜色的变化,可以检测视频中的场景变化。在每个兴趣点设置一个有相似特征的直方图所构成的“标签”,可以用来标记各种不同的事情,比如图像的色彩分布,物体边缘梯度模板等等。是计

    2024年02月09日
    浏览(55)
  • Elasticsearch使用篇 - 直方图聚合、日期直方图聚合、自动日期直方图聚合

    [ˈhɪstəˌɡræm] ,直方图聚合。属于分桶聚合。 基于数值类型的字段或者数值范围类型的字段进行聚合。按照固定间隔动态构建分桶。 field:用于聚合的字段。 interval:指定每个桶之间的间隔。该值必须是一个大于 0 的双精度浮点数。 keyed:默认 false,则使用数组格式返回数

    2024年01月20日
    浏览(56)
  • Python图像增强之直方图均衡化(全局直方图均衡、局部直方图均衡)

    图像增强是有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。 图像增强通常划分

    2024年02月13日
    浏览(38)
  • 【OpenCV学习笔记30】- OpenCV 中的直方图 - 直方图 - 4:直方图反投影

    这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔记的请麻烦帮我关注

    2024年03月26日
    浏览(56)
  • Python遥感图像处理应用篇036:GDAL+Scikit-image计算遥感图像梯度直方图HOG

    方向梯度直方图HOG(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包