目录
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
分别为输入、输出点像素灰度值。
当 a > 1 a>1 a>1时,输出图像像素灰度范围扩大,图像对比度增强,当 a < 1 a<1 a<1时反之。这是因为人眼不易区分相近的灰度值,因此若图像灰度值范围较小,观感上细节不够清晰。当 a = 1 a=1 a=1、 b ≠ 0 b\ne0 b
=0时,点算子使图像灰度整体上移或下移,即整体变亮或变暗。
3直方图均衡化
下图再次给出了关于图像对比度的例子
直方图均衡化是以累计分布函数为核心,将原始图像灰度直方图从比较集中的某个灰度区间,非线性地映射为在全部灰度范围内的较均匀分布,从而增强对比度。
下面阐述直方图均衡化的数学原理。首先作原始图像灰度的概率直方图如图
设输入像素灰度值为 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()
看看效果:
均衡化前:
均衡化后:
🚀 计算机视觉基础教程说明
章号 内容
0 色彩空间与数字成像
1 计算机几何基础
2 图像增强、滤波、金字塔
3 图像特征提取
4 图像特征描述
5 图像特征匹配
6 立体视觉
7 项目实战
🔥 更多精彩专栏:
《机器人原理与技术》
《计算机视觉教程》
《机器学习》
《嵌入式系统》
《数值优化方法》
…