计算机视觉教程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                              项目实战


🔥 更多精彩专栏:


《机器人原理与技术》

《计算机视觉教程》

《机器学习》

《嵌入式系统》

《数值优化方法》


目录
相关文章
|
3天前
|
Python
SciPy 教程 之 Scipy 显著性检验 3
本教程介绍Scipy显著性检验,包括其基本概念、原理及应用。显著性检验用于判断样本与总体假设间的差异是否显著,是统计学中的重要工具。Scipy通过`scipy.stats`模块提供了相关功能,支持双边检验等方法。
10 1
|
5天前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 插值 2
SciPy插值教程:介绍插值概念及其在数值分析中的应用,特别是在处理数据缺失时的插补和平滑数据集。SciPy的`scipy.interpolate`模块提供了强大的插值功能,如一维插值和样条插值。通过`UnivariateSpline()`函数,可以轻松实现单变量插值,示例代码展示了如何对非线性点进行插值计算。
10 3
|
6天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
6天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 7
本教程介绍了SciPy的空间数据处理功能,涵盖如何使用`scipy.spatial`模块进行点的位置判断、最近点计算等操作。还详细解释了距离矩阵的概念及其在生物信息学中的应用,以及汉明距离的定义和计算方法。示例代码展示了如何计算两个点之间的汉明距离。
13 1
|
3天前
|
数据采集 存储 数据处理
探索Python中的异步编程:从基础到实战
【10月更文挑战第39天】在编程世界中,时间就是效率的代名词。Python的异步编程特性,如同给程序穿上了一双翅膀,让它们在执行任务时飞得更高、更快。本文将带你领略Python异步编程的魅力,从理解其背后的原理到掌握实际应用的技巧,我们不仅会讨论理论基础,还会通过实际代码示例,展示如何利用这些知识来提升你的程序性能。准备好让你的Python代码“起飞”了吗?让我们开始这场异步编程的旅程!
10 0
|
4天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 插值 3
本教程介绍了SciPy中的插值方法,包括什么是插值及其在数据处理和机器学习中的应用。通过 `scipy.interpolate` 模块,特别是 `Rbf()` 函数,展示了如何实现径向基函数插值,以平滑数据集中的离散点。示例代码演示了如何使用 `Rbf()` 函数进行插值计算。
9 0
|
4天前
|
Python
SciPy 教程 之 Scipy 显著性检验 1
本教程介绍Scipy显著性检验,包括统计假设、零假设和备择假设等概念,以及如何使用scipy.stats模块进行显著性检验,以判断样本与总体假设间是否存在显著差异。
8 0
|
7天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
机器学习/深度学习 计算机视觉 Python
[雪峰磁针石博客]python计算机视觉深度学习2图像基础
构建自己的图像分类器之前需要了解图像是什么。 像素:图像的元素 像素是图像的基本元素。每个图像都由一组像素组成。没有比像素更细的粒度。 通常像素是光的“颜色”或“强度”。 下图的分辨率为1,000×750,这意味着它是1,000像素宽750像素高。
|
3天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。

热门文章

最新文章