计算机视觉教程2-1:图解直方图均衡化原理+Python实战

简介: 计算机视觉教程2-1:图解直方图均衡化原理+Python实战

目录

1 点算子

点算子是两个像素灰度值间的映射关系,属于像素的逐点运算,相邻像素不参与运算。点算子是最简单的图像处理手段,如:亮度调整、对比度调整、颜色变换、直方图均衡化等等。

2 线性灰度变换

线性灰度变换表达为:


s k = T ( r k ) = a r k + b s_k=T\left( r_k \right) =ar_k+b

s

k


=T(r

k


)=ar

k


+b


其中 r k r_k r

k


、 s k s_k s

k


分别为输入、输出点像素灰度值。


image.png

当 a > 1 a>1 a>1时,输出图像像素灰度范围扩大,图像对比度增强,当 a < 1 a<1 a<1时反之。这是因为人眼不易区分相近的灰度值,因此若图像灰度值范围较小,观感上细节不够清晰。当 a = 1 a=1 a=1、 b ≠ 0 b\ne0 b


=0时,点算子使图像灰度整体上移或下移,即整体变亮或变暗。


image.png

3直方图均衡化

下图再次给出了关于图像对比度的例子


image.png

直方图均衡化是以累计分布函数为核心,将原始图像灰度直方图从比较集中的某个灰度区间,非线性地映射为在全部灰度范围内的较均匀分布,从而增强对比度

下面阐述直方图均衡化的数学原理。首先作原始图像灰度的概率直方图如图


image.png

设输入像素灰度值为 r k r_k r

k


,累计分布函数为

C ( r k ) = 1 n ∑ i = 0 k n i C\left( r_k \right) =\frac{1}{n}\sum_{i=0}^k{n_i}

C(r

k


)=

n

1


 

i=0

k


n

i



其中 n i n_i n

i


为图像中灰度值为 r i r_i r

i


的像素频数, n n n为图像像素总数。设输出像素灰度值为 s k s_k s

k


,像素范围为 s m i n − s m a x s_{min}-s_{max} s

min


−s

max


。期望输出灰度直方图是均匀分布,即


P ( s ) = 1 s max ⁡ − s min ⁡    s min ⁡ ⩽ s ⩽ s max ⁡ P\left( s \right) =\frac{1}{s_{\max}-s_{\min}}\,\, s_{\min}\leqslant s\leqslant s_{\max}

P(s)=

s

max


−s

min


1


s

min


⩽s⩽s

max



令 C ( s k ) = C ( r k ) C\left( s_k \right) =C\left( r_k \right) C(s

k


)=C(r

k


),即得


( C ( r k ) max ⁡ − C ( r k ) min ⁡ ) s k − s min ⁡ s max ⁡ − s min ⁡ + C ( r k ) min ⁡ = C ( r k ) ⇒    s k − s min ⁡ s max ⁡ − s min ⁡ = C ( r k ) − C ( r k ) min ⁡ C ( r k ) max ⁡ − C ( r k ) min ⁡ ⇒    s k − s min ⁡ s max ⁡ − s min ⁡ = C ′ ( r k ) \left( C\left( r_k \right) _{\max}-C\left( r_k \right) _{\min} \right) \frac{s_k-s_{\min}}{s_{\max}-s_{\min}}+C\left( r_k \right) _{\min}=C\left( r_k \right) \\\Rightarrow \,\, \frac{s_k-s_{\min}}{s_{\max}-s_{\min}}=\frac{C\left( r_k \right) -C\left( r_k \right) _{\min}}{C\left( r_k \right) _{\max}-C\left( r_k \right) _{\min}}\\\Rightarrow \,\, \frac{s_k-s_{\min}}{s_{\max}-s_{\min}}=C'\left( r_k \right)

(C(r

k


)

max


−C(r

k


)

min


)

s

max


−s

min


s

k


−s

min



+C(r

k


)

min


=C(r

k


)

s

max


−s

min


s

k


−s

min



=

C(r

k


)

max


−C(r

k


)

min


C(r

k


)−C(r

k


)

min



s

max


−s

min


s

k


−s

min



=C

(r

k


)


所以最终直方图均衡化的点算子为


s k = ( s max ⁡ − s min ⁡ ) C ′ ( r k ) + s min ⁡ = T ( r k ) s_k=\left( s_{\max}-s_{\min} \right) C'\left( r_k \right) +s_{\min}=T\left( r_k \right)

s

k


=(s

max


−s

min


)C

(r

k


)+s

min


=T(r

k


)

4 代码实战

按照前文的原理编写累积分布函数计算公式,以及均衡化算子

# 计算累计分布函数
def C(rk):
  # 读取图片灰度直方图
  # bins为直方图直方柱的取值向量
  # hist为bins各取值区间上的频数取值
  hist, bins = np.histogram(rk, 256, [0, 256])
  # 计算累计分布函数
  return hist.cumsum()
# 计算灰度均衡化映射
def T(rk):
  cdf = C(rk)
  # 均衡化
  cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0
  return cdf.astype('uint8')

均衡化时直接调用函数即可,下面给出完整代码

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
# 计算累计分布函数
def C(rk):
  # 读取图片灰度直方图
  # bins为直方图直方柱的取值向量
  # hist为bins各取值区间上的频数取值
  hist, bins = np.histogram(rk, 256, [0, 256])
  # 计算累计分布函数
  return hist.cumsum()
# 计算灰度均衡化映射
def T(rk):
  cdf = C(rk)
  # 均衡化
  cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0
  return cdf.astype('uint8')
# 读取图片
img = cv.imread('1.png', 0)
# 将二维数字图像矩阵转变为一维向量
rk = img.flatten()
# 原始图像灰度直方图
plt.hist(rk, 256, [0, 255], color = 'r')
cv.imshow("原图像",img)
# 直方图均衡化
imgDst = T(rk)[img]
cv.imshow("直方图均衡化后的图像",imgDst)
plt.hist(imgDst.flatten(), 256, [0, 255], color = 'b')
plt.show()

看看效果:

339ba18b9d8b44259964167cb6b1a883.png

均衡化前:

image.png

均衡化后:

image.png

🚀 计算机视觉基础教程说明


章号                                    内容

 0                              色彩空间与数字成像

 1                              计算机几何基础

 2                              图像增强、滤波、金字塔

 3                              图像特征提取

 4                              图像特征描述

 5                              图像特征匹配

 6                              立体视觉

 7                              项目实战


🔥 更多精彩专栏:


《机器人原理与技术》

《计算机视觉教程》

《机器学习》

《嵌入式系统》

《数值优化方法》


目录
相关文章
|
4天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
13天前
|
机器学习/深度学习 人工智能 算法
图像处理与分析:Python中的计算机视觉应用
【4月更文挑战第12天】Python在计算机视觉领域广泛应用,得益于其丰富的库(如OpenCV、Pillow、Scikit-image)和跨平台特性。图像处理基本流程包括获取、预处理、特征提取、分类识别及重建生成。示例代码展示了面部和物体检测,以及使用GAN进行图像生成。
|
23小时前
|
运维 Shell Python
Shell和Python学习教程总结
Shell和Python学习教程总结
|
2天前
|
人工智能 Python
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
6 0
|
4天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
6天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
9天前
|
API 调度 开发者
深入理解Python异步编程:从Asyncio到实战应用
在现代软件开发中,异步编程技术已成为提升应用性能和响应速度的关键策略。本文将通过实例讲解Python中的异步编程核心库Asyncio的基本概念、关键功能以及其在Web开发中的应用。我们不仅将理论与实践结合,还将展示如何通过实际代码示例解决常见的并发问题,帮助开发者更有效地利用Python进行异步编程。
|
11天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
3月前
|
机器学习/深度学习 计算机视觉
AIGC核心技术——计算机视觉(CV)预训练大模型
【1月更文挑战第13天】AIGC核心技术——计算机视觉(CV)预训练大模型
374 3
AIGC核心技术——计算机视觉(CV)预训练大模型
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测
Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测
67 0

热门文章

最新文章