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

目录

  • 1 点算子
  • 2 线性灰度变换
  • 3 直方图均衡化
  • 4 代码实战

1 点算子

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

2 线性灰度变换

线性灰度变换表达为:

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

其中 r k r_k rk s k s_k sk分别为输入、输出点像素灰度值。

计算机视觉教程2-1:图解直方图均衡化原理+Python实战_第1张图片
a > 1 a>1 a>1时,输出图像像素灰度范围扩大,图像对比度增强,当 a < 1 a<1 a<1时反之。这是因为人眼不易区分相近的灰度值,因此若图像灰度值范围较小,观感上细节不够清晰。当 a = 1 a=1 a=1 b ≠ 0 b\ne0 b=0时,点算子使图像灰度整体上移或下移,即整体变亮或变暗。

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

3 直方图均衡化

下图再次给出了关于图像对比度的例子
计算机视觉教程2-1:图解直方图均衡化原理+Python实战_第3张图片
直方图均衡化是以累计分布函数为核心,将原始图像灰度直方图从比较集中的某个灰度区间,非线性地映射为在全部灰度范围内的较均匀分布,从而增强对比度

下面阐述直方图均衡化的数学原理。首先作原始图像灰度的概率直方图如图
计算机视觉教程2-1:图解直方图均衡化原理+Python实战_第4张图片
设输入像素灰度值为 r k r_k rk,累计分布函数为
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(rk)=n1i=0kni

其中 n i n_i ni为图像中灰度值为 r i r_i ri的像素频数, n n n为图像像素总数。设输出像素灰度值为 s k s_k sk,像素范围为 s m i n − s m a x s_{min}-s_{max} sminsmax。期望输出灰度直方图是均匀分布,即

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)=smaxsmin1sminssmax

C ( s k ) = C ( r k ) C\left( s_k \right) =C\left( r_k \right) C(sk)=C(rk),即得

( 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(rk)maxC(rk)min)smaxsminsksmin+C(rk)min=C(rk)smaxsminsksmin=C(rk)maxC(rk)minC(rk)C(rk)minsmaxsminsksmin=C(rk)

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

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) sk=(smaxsmin)C(rk)+smin=T(rk)

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()

看看效果:

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


均衡化后:


计算机视觉基础教程说明

章号                                    内容
  0                              色彩空间与数字成像
  1                              计算机几何基础
  2                              图像增强、滤波、金字塔
  3                              图像特征提取
  4                              图像特征描述
  5                              图像特征匹配
  6                              立体视觉
  7                              项目实战


更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系

你可能感兴趣的:(计算机视觉教程,计算机视觉,人工智能,深度学习,python)