人工智能之视觉领域 计算机视觉 第十章 图像直方图

人工智能之视觉领域 计算机视觉

第十章 图像直方图


文章目录

  • [人工智能之视觉领域 计算机视觉](#人工智能之视觉领域 计算机视觉)
  • 前言:图像直方图
    • [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》

相关推荐
claude_dev2 小时前
一步步搭建 Claude Code 的 MySQL MCP 服务器(附完整踩坑指南)
人工智能
liliangcsdn2 小时前
V-trace的核心公式与计算过程
人工智能·机器学习
小哈里2 小时前
【科研】ACM MM 论文 Latex 投稿模板修改(基于sample-sigconf-authordraft-v2.16)
人工智能·llm·科研·latex·cv·overleaf
优思学苑2 小时前
过程能力指标CPK高为何现场仍不稳?
大数据·人工智能·管理·pdca·管理方法
AaronZZH2 小时前
AG-UI:连接 AI 智能体与用户应用的开放协议
人工智能·ui
陈天伟教授2 小时前
人工智能应用- 人工智能交叉:05. 从 AlphaFold1 到 AlphaFold2
人工智能·神经网络·算法·机器学习·推荐算法
Eloudy2 小时前
CHI 开发备忘 03 记 -- CHI spec 03 网络层
人工智能·ai·arch·hpc
Together_CZ2 小时前
ViT-5: Vision Transformers for The Mid-2020s—— 面向2020年代中期的视觉Transformer
人工智能·深度学习·ai·transformer·vit·vit-5·面向2020年代中期的视觉
badfl2 小时前
Gemini 3.1 Pro更新内容一览:介绍、令牌限制、如何使用
人工智能·ai