24.8.4学习笔记

图像的直方图

图像的直方图简单来说,就是对图像中像素亮度(或者颜色)分布情况的一种统计图表。

假设我们有一张黑白照片,直方图就会统计出画面中从最黑(0 亮度)到最白(255 亮度)每个亮度级别有多少个像素。

比如说,如果照片大部分区域都很暗,那么直方图中靠近左边(代表低亮度)的部分就会有比较高的“山峰”;如果照片很亮,那直方图中靠近右边(代表高亮度)的部分就会凸起。

直方图均衡化

直方图均衡化是一种图像处理技术,用于改善图像的对比度,使图像看起来更加清晰和明亮。这项技术特别适用于那些整体上较暗或较亮且对比度较低的图像。

在直方图均衡化过程中,原始图像的直方图(即像素强度分布)被转换成一个更均匀的分布。通过这种转换,可以增加图像中不同灰度级的数量,并使得每个灰度级出现的概率大致相等,从而增强图像的对比度和细节。

下面是直方图均衡化的基本步骤:

  1. 计算原始直方图

    • 计算图像中每个灰度级别的像素数。
  2. 累积分布函数 (CDF)

    • 对直方图进行累积求和,得到累积分布函数 (CDF),它表示小于等于某个灰度级别的像素总数。
    • CDF 归一化,确保最大灰度级别的概率值为 1。
    • 例子:

      示例

      假设我们有一幅 88-位灰度图像,它的直方图如下所示:

      灰度级别 kk频率 h(k)
      010
      120
      230
      ......
      25510

      假设图像有 1000010000 个像素,则累积分布函数 CDF(2) 为: CDF(2)=10+20+30=60

      归一化累积分布函数 CDF~(2) 为: CDF~(2)=60/10000=0.006

      缩放回 0 到 255 范围内的值 CDF^(2) 为: CDF^(2)=⌊0.006×255⌋=⌊1.53⌋=1

      通过这种方式,原始灰度级别 2(小于等于2的) 经过直方图均衡化后,将被映射到新的灰度级别 1。

  3. 映射函数

    • 使用归一化的 CDF 来创建一个映射函数,该函数将原始灰度级别映射到新的灰度级别。
    • 新的灰度级别通常是在 [0, L-1] 区间内,其中 L 是灰度级的数量(例如对于 8 位图像,L = 256)。
  4. 应用映射函数

    • 将映射函数应用于图像中的每一个像素,替换原始灰度值。
  5. 生成均衡化后的直方图

    • 处理后的图像会有一个更加均匀分布的直方图,意味着每个灰度级别的像素数量更加接近。

通过这种方式,直方图均衡化能够扩展图像的动态范围并提高对比度,从而让图像看起来更加清晰。然而,这种方法也有其局限性,比如在某些情况下可能会引入过度增强的效果或者造成某些灰度级别的丢失。

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, img_as_ubyte

# 加载一幅灰度图像
# 'as_gray=True' 确保图像以灰度模式加载
image = io.imread("D:\study pic\down.jpg", as_gray=True)

# 将图像转换为8位无符号整数类型,确保后续处理兼容性
image = img_as_ubyte(image)

# 获取图像的尺寸
# shape 返回图像的维度,对于灰度图,返回的是高度和宽度
height, width = image.shape

# 计算总的像素数
# 总像素数等于图像的高度乘以宽度
total_pixels = height * width

# 初始化直方图数组
# 创建一个长度为256的零向量,用于存储每个灰度级别的像素计数
histogram = np.zeros(256, dtype=np.int32)

# 计算每个灰度级别的像素频率
# 遍历图像的每个像素,并根据其灰度级别更新对应的直方图值
for row in range(height):
    for col in range(width):
        histogram[image[row, col]] += 1

# 计算累积分布函数 (CDF)
# 使用 np.cumsum 来计算累积分布函数
cumulative_distribution = np.cumsum(histogram)

# 归一化累积分布函数
# 将累积分布函数除以总像素数,使其值域为 [0, 1]
normalized_cdf = cumulative_distribution / total_pixels

# 将归一化的累积分布函数映射回0到255之间的值
# 使用 np.round 进行四舍五入,然后转换为整数
mapped_cdf = np.round(normalized_cdf * 255).astype(np.uint8)

# 应用映射到原始图像上
# 使用映射后的累积分布函数对原始图像的每个像素进行变换
equalized_image = mapped_cdf[image]

# 绘制原始图像的直方图
# 使用 plt.hist 绘制原始图像的直方图
plt.figure()
plt.title("Original Histogram")
plt.xlabel("Intensity Level")
plt.ylabel("Count")
plt.hist(image.flatten(), bins=256, range=(0, 255), color='gray')

# 绘制均衡化后的图像的直方图
# 使用 plt.hist 绘制均衡化后的图像的直方图
plt.figure()
plt.title("Equalized Histogram")
plt.xlabel("Intensity Level")
plt.ylabel("Count")
plt.hist(equalized_image.flatten(), bins=256, range=(0, 255), color='gray')

# 显示原始图像
# 使用 plt.imshow 显示原始图像
plt.figure()
plt.imshow(image, cmap='gray')
plt.title("Original Image")

# 显示均衡化后的图像
# 使用 plt.imshow 显示均衡化后的图像
plt.figure()
plt.imshow(equalized_image, cmap='gray')
plt.title("Equalized Image")

# 显示所有绘图
# 使用 plt.show 显示所有的图像和直方图
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值