人工智能之视觉领域 计算机视觉
第十章 图像直方图
文章目录
- [人工智能之视觉领域 计算机视觉](#人工智能之视觉领域 计算机视觉)
- 前言:图像直方图
- [1. 通俗理解:什么是图像直方图?](#1. 通俗理解:什么是图像直方图?)
- [🌟 为什么重要?](#🌟 为什么重要?)
- [2. 核心操作](#2. 核心操作)
- [2.1 绘制直方图:`cv2.calcHist()`](#2.1 绘制直方图:
cv2.calcHist())- [2.2 直方图均衡化:`cv2.equalizeHist()`](#2.2 直方图均衡化:
cv2.equalizeHist())- [3. 应用场景](#3. 应用场景)
- [🎯 场景1:图像增强](#🎯 场景1:图像增强)
- [🎯 场景2:医学影像](#🎯 场景2:医学影像)
- [🎯 场景3:视频监控](#🎯 场景3:视频监控)
- [4. 完整工作流程(Mermaid 图)](#4. 完整工作流程(Mermaid 图))
- [5. 配套代码实战](#5. 配套代码实战)
- [示例 1:绘制灰度图像直方图](#示例 1:绘制灰度图像直方图)
- [示例 2:直方图均衡化](#示例 2:直方图均衡化)
- [示例 3:彩色图像的直方图均衡化](#示例 3:彩色图像的直方图均衡化)
- [6. 高级技巧与注意事项](#6. 高级技巧与注意事项)
- [⚠️ 注意事项 1:直方图均衡化的局限性](#⚠️ 注意事项 1:直方图均衡化的局限性)
- [⚠️ 注意事项 2:自适应直方图均衡化(CLAHE)](#⚠️ 注意事项 2:自适应直方图均衡化(CLAHE))
- [⚠️ 注意事项 3:多通道图像处理](#⚠️ 注意事项 3:多通道图像处理)
- [7. 总结](#7. 总结)
- 资料关注
前言:图像直方图
学习目标:掌握如何使用 OpenCV 绘制和分析图像的亮度分布,并通过直方图均衡化技术增强图像对比度,优化曝光不足或过曝的图像。
1. 通俗理解:什么是图像直方图?
想象你有一张照片:
- 每个像素都有一个亮度值(0-255)
- 直方图就是统计每个亮度值出现的次数!
✅ 直方图 = 图像亮度分布的"指纹"
- 帮助我们了解图片的整体明暗程度
- 是调整图像对比度、色彩的基础
🌟 为什么重要?
- 曝光判断:是否太亮/太暗
- 对比度评估:画面细节是否丰富
- 图像增强:为后续处理提供依据
2. 核心操作
2.1 绘制直方图:cv2.calcHist()
python
hist = cv2.calcHist(images, channels, mask, histSize, ranges)
| 参数 | 说明 |
|---|---|
images |
输入图像(必须是列表形式 [img]) |
channels |
通道索引(0=灰度,[0]=BGR中的蓝,[1]=绿,[2]=红) |
mask |
掩码图像(None=全图,其他=指定区域) |
histSize |
直方图尺寸(bin的数量,如 [256]) |
ranges |
像素值范围(通常为 [0, 256]) |
2.2 直方图均衡化:cv2.equalizeHist()
仅适用于单通道灰度图像:
python
equ = cv2.equalizeHist(img)
💡 原理:重新分配亮度值,使整个图像的亮度更加均匀
3. 应用场景
🎯 场景1:图像增强
- 对比度低的图像 → 提升视觉效果
- 曝光不足或过曝 → 改善亮度分布
🎯 场景2:医学影像
- X光片等医疗图像 → 提高病变区域的可见度
🎯 场景3:视频监控
- 在低光照条件下 → 增强图像清晰度
4. 完整工作流程(Mermaid 图)
彩色
灰度
不满意
满意
原始图像
彩色 or 灰度?
转换为灰度
跳过
计算直方图
对比度满意?
直方图均衡化
显示直方图
显示结果图像
5. 配套代码实战
示例 1:绘制灰度图像直方图
python
import cv2
import numpy as np
from matplotlib import pyplot as plt
def plot_histogram(image, title):
# 计算直方图
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
# 绘制直方图
plt.figure()
plt.title(title)
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0, 256])
# 读取图像并转为灰度
img = cv2.imread('low_contrast.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 绘制原始图像直方图
plot_histogram(gray, "Original Image Histogram")
# 显示图像和直方图
cv2.imshow("Original Image", gray)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
示例 2:直方图均衡化
python
import cv2
import numpy as np
from matplotlib import pyplot as plt
def plot_histogram(image, title):
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
plt.figure()
plt.title(title)
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0, 256])
# 读取图像并转为灰度
img = cv2.imread('low_contrast.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 执行直方图均衡化
equ = cv2.equalizeHist(gray)
# 绘制均衡化后的直方图
plot_histogram(equ, "Equalized Histogram")
# 显示原始与均衡化后的图像及其直方图
cv2.imshow("Original Image", gray)
cv2.imshow("Equalized Image", equ)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
示例 3:彩色图像的直方图均衡化
对于彩色图像,需要分别对每个通道进行均衡化:
python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('color_image.jpg')
# 分离颜色通道
b, g, r = cv2.split(img)
# 分别对每个通道执行直方图均衡化
b_equ = cv2.equalizeHist(b)
g_equ = cv2.equalizeHist(g)
r_equ = cv2.equalizeHist(r)
# 合并均衡化后的通道
equ_img = cv2.merge((b_equ, g_equ, r_equ))
# 显示原始图像和均衡化后的图像
cv2.imshow("Original Image", img)
cv2.imshow("Equalized Image", equ_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 可选:绘制每个通道的直方图
for i, (channel, color) in enumerate(zip([b, g, r], ['blue', 'green', 'red'])):
hist = cv2.calcHist([channel], [0], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
6. 高级技巧与注意事项
⚠️ 注意事项 1:直方图均衡化的局限性
- 对于已经具有良好对比度的图像,均衡化可能不会带来显著改善
- 过度均衡化可能导致图像失真(如噪声放大)
⚠️ 注意事项 2:自适应直方图均衡化(CLAHE)
- 解决全局均衡化带来的问题
- 使用
cv2.createCLAHE()创建 CLAHE 对象,然后调用.apply()方法
python
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
cl1 = clahe.apply(gray)
⚠️ 注意事项 3:多通道图像处理
- 不同颜色通道应独立处理
- 或者将图像转为 Lab 色彩空间,只对 L(亮度)通道进行均衡化
7. 总结
| 步骤 | 关键操作 | 函数 |
|---|---|---|
| 预处理 | 彩色→灰度 | cvtColor(..., cv2.COLOR_BGR2GRAY) |
| 绘制直方图 | 计算亮度分布 | cv2.calcHist(...) |
| 均衡化 | 提升对比度 | cv2.equalizeHist(...) 或 cv2.createCLAHE().apply(...) |
| 展示结果 | 显示直方图和图像 | Matplotlib.pyplot |
🌟 你现在可以:
- 绘制任何图像的亮度分布直方图
- 使用直方图均衡化提升图像对比度
- 对比度不足或过度曝光的图像进行修复
下一章,我们将深入探讨边缘检测------识别图像中物体边界的强大工具!
资料关注
咚咚王
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》