opencv的图像直方图处理

1 opencv的直方图

1.1 什么是直方图

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

直方图在许多领域有重要的应用,包括统计学、图像处理、数据分析等。在图像处理中,直方图可以用来分析图像的像素值分布,从而进行图像增强、对比度调整、图像分割等操作。在统计学中,直方图可以帮助我们了解数据的分布情况,如正态分布、偏态分布等。通过观察直方图,我们可以对数据的特征有更深入的了解,从而做出更准确的决策和分析

直方图的主要特点如下:

  • 横轴(X 轴): 横轴表示数据的数值范围或区间。每个区间通常由两个数值来表示,例如,0-10、10-20 等。

  • 纵轴(Y 轴): 纵轴表示每个区间中数据的频次(或频率),也就是该区间内数据出现的次数。

  • 条形图: 直方图的图形由一系列的矩形条组成,每个矩形条的宽度表示区间的宽度,高度表示该区间内数据的频次。

  • 连续数据: 直方图适用于连续型数据,例如测量数据、时间数据等。对于离散型数据,柱状图可能更为适合。

 

1.2 什么是图像直方图

图像直方图
(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。在图像直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反(图像里各种灰度级出现的次数作出的图形)。

  • 横坐标: 图像中各个像素点的灰度级.(比如像素的值都是在0-255之间,每个具体的数值就是一个灰度级)

  •  纵坐标: 具有该灰度级的像素个数.

注意: 直方图是根据灰度图进行绘制的,而不是彩色图像。

1.3 图像直方图的含义

例如,有一幅图像如图 13-1 所示。该图中只有 9 个像素点,存在 1、2、3、4、5,共 5 个灰度级。

统计各个灰度级出现的次数,如表 13-1 所示


在绘制直方图时,将灰度级作为 x 轴处理,该灰度级出现的次数作为 y 轴处理,则可知:

  • x 轴的数据为 x=[1 2 3 4 5]。
  • y 轴的数据为 y=[3 1 2 1 2]。

根据上述关系,可以绘制出如图 13-2 所示的折线图(左图)和直方图(右图)。一般情况下,我们把左侧的直线图和右侧直方图都称为直方图。

在实际处理中,图像直方图的 x 轴区间一般是[0, 255],对应的是 8 位位图的 256 个灰度级;y 轴对应的是具有相应灰度级的像素点的个数。

例如在图 13-3 中,上图是一张图像,下图则是其对应的直方图。图中圆点表示这些像素点会被统计到对应的灰度级上。

虽然 8 位的图像都具有 256 个灰度级(每一个像素可以有 256 个灰度值),但是属于不同灰度级的像素数量是很不一样的。

例如图 13-4,从图中可以看出,图像的不同部分直方图是不一样的。

有时为了便于表示,也会采用归一化直方图。在归一化直方图中,x 轴仍然表示灰度级;y轴不再表示灰度级出现的次数,而是灰度级出现的频率。

例如,针对图 13-1,统计各个灰度级出现的频率:

  • 灰度级出现的频率 = 灰度级出现的次数/总像素数

在图 13-1 中共有 9 个像素,所以统计结果如表 13-2 所示。

在归一化直方图中,各个灰度级出现的频率之和为 1。例如,本例中:


在绘制直方图时,将灰度级作为 x 轴数据处理,将其出现的频率作为 y 轴数据处理,则可知:

  • x 轴的数据为 x=[1 2 3 4 5]

  • y 轴的数据为 y=[3/9 1/9 2/9 1/9 2/9]

根据上述关系,可以绘制出如图 13-5 所示的归一化直方图。对比图 13-4 与图 13-5,可以看到,归一化直方图与直方图在外观上是一致的,只是 y 轴的标签不同而已。

本例中,在直方图内,y 轴显示的标签是 1、2、3;在归一化直方图中,y 轴显示的标签是 1/9、2/9、3/9。


在 OpenCV 的官网上,特别提出了要注意三个概念:DIMS、BINS、RANGE。

  • DIMS:表示在绘制直方图时,收集的参数的数量。一般情况下,直方图中收集的数据只有一种,就是灰度级。因此,该值为 1。

  • RANGE:表示要统计的灰度级范围,一般为[0, 255]。0 对应的是黑色,255 对应的是白色。

  • BINS:参数子集的数目。在处理数据的过程中,有时需要将众多的数据划分为若干个组,再进行分析。

例如,针对图 13-1 中的灰度级,你可能希望将两个像素值作为一组讨论。这样,整个灰度级被划分为三组,具体为{ {1,2} , {3,4} , {5} }。图 13-6 所示的是划分前后的直方图情况。

也可以按照上述方式对灰度图像进行划分。例如,在灰度图像中,将[0, 255]区间内的 256个灰度级,按照每 16 个像素一组划分为子集:

    [0, 255] = [0, 15] ∪ [16, 31] ∪…∪[240, 255]

按照上述方式,整个灰度级范围可以划分为 16 个子集,具体为:

    整个灰度级范围 = bin1 ∪ bin2 ∪…∪ bin16

子集划分完以后,某灰度图像生成的直方图如图 13-7 所示(图中的 b1 代表 bin1,b2 代表bin2,以此类推)。


下面讨论 BINS 的值:

  • 针对图 13-1,在原始图像中,共有 5 个灰度级,其 BINS 值为 5。在以 2 个灰度级为一个小组划分子集后,得到 3 个子集,其 BINS 值为 3。

  • 针对灰度图像,灰度级区间为[0, 255],共有 256 个灰度级,其 BINS 值为 256;在以 16个灰度级为一个小组划分子集后,其 BINS 值为 16。

BINS就是柱子的数量。

1.4 图像直方图的应用

图像直方图是图像处理和分析中的一个基本工具,它统计了图像中每个像素强度值的频率分布。图像直方图在多个方面对于理解和操作图像至关重要。

图像增强

  • 对比度调整: 直方图可以用于增强图像的对比度。例如,直方图均衡化是一种常用的技术,通过均匀分布直方图中的像素强度,可以提高图像的全局对比度。如果是曝光过度可以减少补光,如果光线不够,可以补光

  • 自动亮度和对比度调整: 分析直方图,自动确定最佳的亮度和对比度设置,以改善图像质量。

阈值处理

  • 图像分割: 直方图可以用于确定分割图像的最佳阈值,特别是在二值化处理中。这在文档扫描和对象识别等领域特别有用。

  • 背景和前景分离: 在简单背景的图像中,直方图可以帮助区分背景和前景对象。

图像分析

  • 灰度分布分析: 直方图提供了图像中像素强度的分布情况,有助于分析图像的明暗结构和内容。

  • 纹理分析: 直方图的形状和分布可以用来分析图像的纹理特征。

颜色处理

  • 颜色平衡: 在彩色图像处理中,可以分别对红、绿、蓝三个颜色通道的直方图进行调整,以实现颜色平衡。

  • 颜色分割和识别: 利用颜色直方图来识别和分割图像中的特定颜色区域。

图像恢复

  • 噪声识别和过滤: 直方图有助于识别图像中的噪声模式,并可以指导选择适当的噪声过滤技术。

 

2 Numpy绘制直方图

模块 matplotlib.pyplot 提供了一个类似于 MATLAB 绘图方式的框架,可以使用其中的matplotlib.pyplot.hist()函数(以下简称为 hist()函数)来绘制直方图。

此函数的作用是根据数据源和灰度级分组绘制直方图。其基本语法格式为:

matplotlib.pyplot.hist(X,BINS)

参数描述:

  • X:数据源,必须是一维的。图像通常是二维的,需要使用 ravel()函数将图像处理为一维数据源以后,再作为参数使用。

  • BINS:BINS 的具体值,表示灰度级的分组情况。

函数 ravel()的作用是将二维数组降维成一维数组。

import cv2
import matplotlib.pyplot as plt

image = cv2.imread("../data/ship.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
plt.hist(image.ravel(), 256)
plt.show()

 运行代码显示:

使用函数 hist()将一幅图像的灰度级划分为 16 组后,绘制该图像的直方图。

import cv2
import matplotlib.pyplot as plt

image = cv2.imread("../data/ship.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
plt.hist(image.ravel(), 16)
plt.show()

 运行代码显示:

3 opencv绘制直方图

OpenCV 提供了函数 cv2.calcHist()用来计算图像的统计直方图,该函数能统计各个灰度级的像素点个数。利用matplotlib.pyplot 模块中的 plot()函数,可以将函数 cv2.calcHist()的统计结果绘制成直方图

3.1 用cv2.calcHist()绘制直方图

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

参数及返回值:

  • hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数。

  • images:原始图像,该图像需要使用“[ ]”括起来。

  • channels:指定通道编号。通道编号需要用“[ ]”括起来,如果输入图像是单通道灰度图像,该参数的值就是[0]。对于彩色图像,它的值可以是[0]、[1]、[2],分别对应通道B、G、R。

  • mask:掩模图像。当统计整幅图像的直方图时,将这个值设为 None。当统计图像某一部分的直方图时,需要用到掩模图像。

  • histSize:BINS 的值,该值需要用“[ ]”括起来。例如,BINS 的值是 256,需要使用“[256]”作为此参数值。

  • ranges:即像素值范围。例如,8 位灰度图像的像素值范围是[0, 255]。

  • accumulate:累计(累积、叠加)标识,默认值为 False。如果被设置为 True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。该参数允许从多个对象中计算单个直方图,或者实时更新直方图。该参数是可选的,一般情况下不需要设置。

 示例代码:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("../data/ship.jpg")
hist = cv2.calcHist([img], [0], None, [16], [0, 255])
print(type(hist))
print(hist.shape)
print(hist.size)
print(hist)

plt.plot(hist, color='b')
plt.show()

运行代码显示:

<class 'numpy.ndarray'>
(16, 1)
16
[[7.855000e+03]
 [1.507600e+04]
 [8.501000e+03]
 [9.885000e+03]
 [9.599000e+03]
 [5.452000e+03]
 [6.495000e+03]
 [1.184100e+04]
 [2.672000e+04]
 [1.451440e+05]
 [3.919380e+05]
 [1.306336e+06]
 [1.253990e+05]
 [3.002000e+03]
 [3.080000e+02]
 [4.400000e+01]]

3.2 直方图均衡化

如果一幅图像拥有全部可能的灰度级,并且像素值的灰度均匀分布,那么这幅图像就具有高对比度和多变的灰度色调,灰度级丰富且覆盖范围较大。在外观上,这样的图像具有更丰富的色彩,不会过暗或过亮。

图 13-22 展示了对一幅图像进行直方图均衡化前后的对比,左图是原始图像,比较暗;右图是均衡化后的图像,色彩比较均衡。

在 OpenCV 的官网上,对图像均衡化(即直方图均衡化)前后的直方图进行了对比,如图13-23 所示。其中,左图是原始图像的直方图,可以看到灰度级集中在中间,图像中没有较暗和较亮的像素点;右图是对原图均衡化后的直方图,像素分布更均衡。

直方图均衡化的主要目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均匀的图像。这种均衡化,既实现了灰度值统计上的概率均衡,也实现了人类视觉系统(Human Visual System,HVS)上的视觉均衡。

OpenCV 使用函数 cv2.equalizeHist()实现直方图均衡化。该函数的语法格式为: 

dst = cv2.equalizeHist( src )
  • dst 是直方图均衡化处理的结果。

  • src 是 8 位单通道原始图像。

示例代码:

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('../data/girl_008.jpg', cv2.IMREAD_GRAYSCALE)
equ_img = cv2.equalizeHist(img)

plt.subplot(1, 2, 1)
plt.imshow(img, cmap='gray')

plt.subplot(1, 2, 2)
plt.imshow(equ_img, cmap='gray')

plt.figure("原始图像直方图")
plt.hist(img.ravel(), 256)
plt.figure("均衡化结果直方图")
plt.hist(equ_img.ravel(), 256)
plt.show()

运行代码显示:

图片均衡化效果很明显:在直方图均衡化之前,图像整体比较亮;均衡化以后,图像的亮度变得比较均衡。而两幅图像的直方图的对比,则不太明显。这实际上体现了,均衡化是指综合考虑了统计概率和 HVS 的结果。

补充说明:

  • 原始图像的直方图,大部分的像素值集中在右侧(线条密集)。这说明图像中位于[200,255]区间的像素点很多,图像比较亮。

  • 在均衡化后的直方图中,左侧的像素点比较密集而右侧的相对比较稀疏。但是,实际上人眼并不能明显感受到像素值的细微差别,所以我们可以将相近的像素值看成同一个像素值,这样就会得到类似于图 13-29 的直方图。此时,直方图内灰度级的分布就比较均衡了,是均衡一致的直方图。

 3.3 自适应的直方图均衡化

直方图均衡化中,考虑的是图像全局的对比度,许多情况下,会由于均衡化而丢失许多信息,为了解决此问题,需要使用自适应的直方图均衡化,此时,整幅图片被分成许多小块,称为tiles(在OpenCV中tiles的大小默认是8x8),然后再对每一个小块分别进行直方图均衡化。如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。对于每个小块来说,如果直方图中的bin超过对比度的上限的话,就把其中的像素点均匀分散到其他bins中,然后在进行直方图均衡化。最后使用双线性差值,对每一小块进行拼接

cv.createCLAHE(clipLimit,tileGridSize)

参数:

  • clipLimit:对比度限制,默认是40

  • tileGridSize:分块的大小,默认8*8

示例代码:

import matplotlib.pyplot as plt
import cv2
img = cv2.imread('../data/girl_008.jpg', cv2.IMREAD_GRAYSCALE)

# 创建一个自适应均衡化对象
cl = cv2.createCLAHE(2.0, (8, 8))
# 将其应用于图像
clahe = cl.apply(img)

plt.subplot(1, 2, 1)
plt.imshow(img, cmap='gray')

plt.subplot(1, 2, 2)
plt.imshow(clahe, cmap='gray')
plt.show()

运行代码显示:

3.4 使用掩膜的直方图(mask)

掩膜,对图片的某一个区域进行操作

如何生成掩膜

  • 先生成一个全黑的和原始图片大小一样大的图片. mask = np.zeros(image.shape, np.uint8)
  • 将想要的区域通过索引方式设置为255. 例如:mask[100:200, 200: 300] = 255
  • 通过cv2.bitwise_and( )将image和mask进行与运算得到image_mask掩膜图像

示例代码:

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

lena = cv2.imread('../data/lena.jpeg')
gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)

# 生成掩膜图像, shape的形状要和gray一致
mask = np.zeros(gray.shape, np.uint8)

# 设置想要统计直方图的区域
mask[400:800, 400: 800] = 255

# 对mast和gray进行直方图统计对比
hist_mask = cv2.calcHist([gray], [0], mask, [256], [0, 255])
hist_gray = cv2.calcHist([gray], [0], None, [256], [0, 255])

plt.plot(hist_mask, label='mask')
plt.plot(hist_gray, label='gray')
plt.show()

plt.subplot(1, 3, 1)
plt.imshow(mask, cmap='gray')
plt.subplot(1, 3, 2)
plt.imshow(gray, cmap='gray')
plt.subplot(1, 3, 3)
plt.imshow(cv2.bitwise_and(gray, mask), cmap='gray')
plt.show()

 运行代码显示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226033.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jvm常见问题

1. 为什么用元空间替换永久代 避免OOM异常&#xff1a;永久代中存放了很多JVM需要的类信息&#xff0c;这些数据大多数是不会被清理的&#xff0c;所以Full GC往往无法回收多少空间。而永久代的空间是有限的&#xff0c;如果经常加载新的类进来或者频繁的创建和删除类&#xf…

1-2算法基础-常用库函数

1.排序 sort(first,last,cmp) first指向要排序范围的第一个元素&#xff0c;从0起 last指向要排序范围的最后一个元素的下一个位置 cmp&#xff08;可选&#xff09;&#xff0c;自定义函数&#xff0c;默认从小到大 评测系统 #include <iostream> #include<algorith…

数据库备份脚本

#!/bin/bash #数据库备份 #工具&#xff1a;xtrabackupif [ ! -d /xtrabackup/ ];thenmkdir /xtrabackup/{full,inter,diff} -p fito_mail15191876750163.com db_userroot db_passwdAren123 basedir/xtrabackup/full/ baseinter/xtrabackup/inter/ basediff/xtrabackup/diff/ f…

Java程序员,你掌握了多线程吗?(文末送书)

目录 01、多线程对于Java的意义02、为什么Java工程师必须掌握多线程03、Java多线程使用方式04、如何学好Java多线程送书规则 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流…

房产报备小程序开发方案详解

房产客户报备小程序&#xff0c;php语言&#xff0c;uniapp前端。 房产公司合作的一些渠道商&#xff0c;渠道商在报备端报备客户&#xff0c;房产公司的人在确客端确认报备。报备的客户是以手机号为判断&#xff0c;已经报备过的手机号无法再次报备&#xff0c;有效时间到期后…

Python-基本的输入和输出(input函数和print函数用法)

输入 输出 控制台:一种人和计算机交互最基础的方式 什么是控制台&#xff1f;下面这个东西就是控制台。 但是生活中常用的是图形化界面&#xff0c;最初始的计算机使用的就是这样的控制台进行输入和输出的。 所以原来会使用计算机的都是科学家或者高级知识分子。 直到图形化界…

动手学深度学习笔记

1. 深度学习基础与MLP 1.1 框架&#xff1a; 线性回归&#xff1b; Softmax回归&#xff08;实际上用于分类问题&#xff09;&#xff1b; 感知机与多层感知机&#xff1b; 模型选择&#xff1b; 权重衰退&#xff08;weight decay&#xff09;&#xff1b; 丢弃法&…

使用VS Code远程开发MENJA小游戏并通过内网穿透分享本地游戏到公网

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 推荐一个人工智能学习网站 点击跳转学习 前言 本篇教程&#xff0c;我们将通过VS Code实现远程开发MENJA小游戏&#xff0c;并通…

hibernate实现ID序列自增,异常处理

目录 一、问题描述 二、问题解析 一、问题描述 明明数据库表设置了id自增&#xff0c;为啥添加数据时&#xff0c;会抛出异常呢&#xff1f; 具体内容如下&#xff1a; &#xff08;1&#xff09;控制台异常打印如下 org.hibernate.id.IdentifierGenerationException: ids f…

vue.js el-table 动态单元格列合并

一、业务需求&#xff1a; 一个展示列表&#xff0c;表格中有一部分列是根据后端接口动态展示&#xff0c;对于不同类型的数据展示效果不一样。如果接口返回数据是’类型1‘的&#xff0c;则正常展示&#xff0c;如果是’类型2‘的数据&#xff0c;则合并当前数据的动态表格。…

uniapp 打开文件管理器上传(H5、微信小程序、android app三端)文件

H5跟安卓APP 手机打开的效果图&#xff1a; Vue页面&#xff1a; <template><view class"content"><button click"uploadFiles">点击上传</button></view> </template><script>export default {data() {return…

AIOps探索 | 面向多告警源,如何进行统一事件管理 (下)

文章来源&#xff1a;公众号ID-布博士&#xff08;擎创科技资深产品专家&#xff09; 书接上期&#xff0c;本期我们继续分享“统一事件管理”和“智能事件分析与处置”&#xff0c;新来的朋友点这里&#xff0c; AIOps探索 | 面向多告警源&#xff0c;如何进行统一事件管理 &a…

用户案例|Milvus 助力 Credal.AI 实现 GenAI 安全与可控

AIGC 时代&#xff0c;企业流程中是否整合人工智能&#xff08;AI&#xff09;对于的企业竞争力至关重要。然而&#xff0c;随着 AI 不断发展演进&#xff0c;企业也在此过程中面临数据安全管理、访问权限、数据隐私等方面的挑战。 为了更好地解决上述问题&#xff0c;Credal.A…

拼多多商品详情API接口丨百亿补贴商品数据丨秒杀商品数据

拼多多API接口是拼多多网提供的一种应用程序接口&#xff0c;允许开发者通过程序访问拼多多网站的数据和功能。通过拼多多API接口&#xff0c;开发者可以开发各种应用程序&#xff0c;如店铺管理工具、数据分析工具、购物比价工具等。在本章中&#xff0c;我们将介绍拼多多API接…

「薄荷绿」风电智慧运营,有效提高运营效率和能源利用率

随着能源需求的不断增加和全球变暖的加剧&#xff0c;人们对可再生能源的依赖程度不断提高。其中&#xff0c;风能作为一种可再生能源&#xff0c;其清洁、环保、无污染等特点备受青睐&#xff0c;其发展也越来越受到政府和企业的关注。然而&#xff0c;由于风能的不稳定性和不…

初创企业的智慧选择:解析小型企业如何借助ERP系统提升管理效率

ERP系统是不可或缺的企业技术解决方案&#xff0c;其全面性和综合性使其成为企业管理战略的核心组成部分&#xff1b;特别是对于渴望发展的小型企业和初创企业而言&#xff0c;ERP系统的价值更是不可忽视的。 对于大型企业&#xff0c;ERP系统提供了微观管理业务各个方面的能力…

JSP以监听生命周期为例 讲解监听器

好 最后 我们说说监听器 内容还是非常多的 这里 从老师哪里拿到的一个文案 大家可以查看具体内容 我们这里以监听声明周期为例 这边 我们在项目java模块下创建一个包 叫 listener 名字随便取 我们就这样 看着明显一点 然后 我们在下面创建一个java类 叫 test 因为是用来测试的…

视频集中存储/智能分析融合云平台EasyCVR平台接入rtsp,突然断流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

宁夏一男子吸烟“逼”慢高铁 拘留7天 AI技术如何提升公共安全

最近&#xff0c;宁夏的一位男子杨某在高铁卫生间吸烟&#xff0c;触发了列车的烟雾报警系统&#xff0c;导致列车降速运行&#xff0c;最终被拘留7天。这个事件凸显了公共安全的重要性&#xff0c;特别是在交通工具上的安全管理。如果我们能够及时发现并阻止这种行为&#xff…

【论文解读】:大模型免微调的上下文对齐方法

本文通过对alignmenttuning的深入研究揭示了其“表面性质”&#xff0c;即通过监督微调和强化学习调整LLMs的方式可能仅仅影响模型的语言风格&#xff0c;而对模型解码性能的影响相对较小。具体来说&#xff0c;通过分析基础LLMs和alignment-tuned版本在令牌分布上的差异&#…