问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

直方图的均衡化原理及代码实现

创作时间:
作者:
@小白创作中心

直方图的均衡化原理及代码实现

引用
CSDN
1.
https://blog.csdn.net/AI_dataloads/article/details/133893140

直方图均衡化是一种用于增强图像对比度的图像处理技术。它的原理是通过重新分布图像的像素值,使图像的直方图变得更加均匀,从而增强图像中不同区域的亮度差异,使图像更具视觉吸引力和清晰度。

原理解释

  1. 计算原始图像的直方图
  • 首先,对输入的图像进行灰度化处理,将彩色图像转换为灰度图像。
  • 然后,计算灰度图像的直方图,直方图是一个表示不同灰度级别在图像中出现频率的图表。
  1. 计算累积直方图
  • 累积直方图是将每个灰度级别的频率累积起来的直方图。
  • 累积直方图的目的是为了确定每个灰度级别在均衡化后图像中所占的比例。
  1. 均衡化像素值
  • 对于每个像素,使用累积直方图来映射原始灰度级别到新的灰度级别。
  • 这个映射过程将使直方图变得更加均匀,以便更多的像素值可以覆盖整个灰度范围。
  1. 创建均衡化后的图像
  • 使用映射后的灰度级别替代原始图像中的每个像素值。
  • 这将生成一个均衡化后的图像,其中亮度差异更加明显,对比度增强。
  1. 优点和应用
  • 直方图均衡化可以用于图像增强、目标检测、图像分割和计算机视觉中的许多应用,特别是在具有低对比度的图像中。
  • 它帮助凸显图像中的细节,改善可视化效果。

代码实现

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

# 读取图像为灰度图像
face = cv2.imread('face1.jpg', cv2.IMREAD_GRAYSCALE)

# 计算并显示原始图像的直方图
phone_hist = cv2.calcHist([face], [0], None, [256], [0, 256])
plt.hist(face.ravel(), bins=256)  # numpy中的ravel将数组多维度拉成一维数组
plt.show()

# 进行直方图均衡化
face_equalize = cv2.equalizeHist(face)

# 显示均衡化后的直方图
plt.hist(face_equalize.ravel(), bins=256)  # numpy中的ravel将数组多维度拉成一维数组
plt.show()

# 横向拼接原始图像和均衡化后的图像
res = np.hstack((face, face_equalize))
cv2.imshow('face_equalize', res)
cv2.waitKey(100000)

# 使用CLAHE进行局部直方图均衡化
clahe = cv2.createCLAHE(clipLimit=1.0, tileGridSize=(16, 16))  # 通过类创建了一个局部均衡化对象
face_clahe = clahe.apply(face)

# 横向拼接原始图像、全局均衡化和局部均衡化后的图像
res = np.hstack((face, face_equalize, face_clahe))
cv2.imshow('face_equalize', res)
cv2.waitKey(100000)

运行结果


总结

直方图均衡化可以显著增强图像的对比度,使图像中的细节更加清晰。然而,需要注意的是,直方图均衡化可能会导致一些不希望的效果,如图像的噪声增强和失真。因此,在应用均衡化时,需要谨慎选择合适的参数和调整,以确保最佳的结果。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号