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


🔥 更多精彩专栏:


《机器人原理与技术》

《计算机视觉教程》

《机器学习》

《嵌入式系统》

《数值优化方法》


目录
打赏
0
0
0
0
25
分享
相关文章
Python数据分析全流程指南:从数据采集到可视化呈现的实战解析
在数字化转型中,数据分析成为企业决策核心,而Python凭借其强大生态和简洁语法成为首选工具。本文通过实战案例详解数据分析全流程,涵盖数据采集、清洗、探索、建模、可视化及自动化部署,帮助读者掌握从数据到业务价值的完整技能链。
37 0
过三色刷脸技术,过三色刷脸技术教程,插件过人脸python分享学习
三色刷脸技术是基于RGB三通道分离的人脸特征提取方法,通过分析人脸在不同颜色通道的特征差异
1688平台开放接口实战:如何通过API获取店铺所有商品数据(Python示列)
本文介绍如何通过1688开放平台API接口获取店铺所有商品,涵盖准备工作、接口调用及Python代码实现,适用于商品同步与数据监控场景。
Python深浅拷贝全解析:从原理到实战的避坑指南
在Python开发中,深浅拷贝是处理对象复制的关键概念。直接赋值仅复制引用,修改副本会影响原始数据。浅拷贝(如切片、copy方法)创建新容器但共享嵌套对象,适用于单层结构或需共享子对象的场景;而深拷贝(copy.deepcopy)递归复制所有层级,确保完全独立,适合嵌套结构或多线程环境。本文详解二者原理、实现方式及性能考量,帮助开发者根据实际需求选择合适的拷贝策略,避免数据污染与性能浪费。
48 1
Python爬虫动态IP代理报错全解析:从问题定位到实战优化
本文详解爬虫代理设置常见报错场景及解决方案,涵盖IP失效、403封禁、性能瓶颈等问题,提供动态IP代理的12种核心处理方案及完整代码实现,助力提升爬虫系统稳定性。
42 0
AIGC核心技术——计算机视觉(CV)预训练大模型
【1月更文挑战第13天】AIGC核心技术——计算机视觉(CV)预训练大模型
880 3
AIGC核心技术——计算机视觉(CV)预训练大模型
关于计算机视觉中的自回归模型,这篇综述一网打尽了
这篇综述文章全面介绍了自回归模型在计算机视觉领域的应用和发展。文章首先概述了视觉中的序列表示和建模基础知识,随后根据表示策略将视觉自回归模型分为基于像素、标记和尺度的三类框架,并探讨其与生成模型的关系。文章详细阐述了自回归模型在图像、视频、3D及多模态生成等多方面的应用,列举了约250篇参考文献,并讨论了其在新兴领域的潜力和面临的挑战。此外,文章还建立了一个GitHub存储库以整理相关论文,促进了学术合作与知识传播。论文链接:https://arxiv.org/abs/2411.05902
124 1
AI计算机视觉笔记二十 九:yolov10竹签模型,自动数竹签
本文介绍了如何在AutoDL平台上搭建YOLOv10环境并进行竹签检测与计数。首先从官网下载YOLOv10源码并创建虚拟环境,安装依赖库。接着通过官方模型测试环境是否正常工作。然后下载自定义数据集并配置`mycoco128.yaml`文件,使用`yolo detect train`命令或Python代码进行训练。最后,通过命令行或API调用测试训练结果,并展示竹签计数功能。如需转载,请注明原文出处。
Vision Mamba:将Mamba应用于计算机视觉任务的新模型
Mamba是LLM的一种新架构,与Transformers等传统模型相比,它能够更有效地处理长序列。就像VIT一样现在已经有人将他应用到了计算机视觉领域,让我们来看看最近的这篇论文“Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Models,”
1063 7

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问