可见,直方图均衡化的图像的对比度增强了,原先图像灰色区域的斜街变得清晰。
PCA(Principal Component Analysis, 主成分分析)是一个非常有用的降维技巧,它可以在使用尽可能少的维数的前提下,尽可能多地保持训练数据的信息。详细介绍及使用见我的另一篇文章:PCA降维
SciPy是建立在Numpy基础上,用于数值运算的开源工具包。Scipy提供很多高效的操作,可以实现数值积分、优化、统计、信号处理,以及对我们来说最为重要的图像处理功能。
图像的高斯模糊是非常经典的图像卷积例子。本质上,图像模糊就是将(灰度)图像 \(I\) 和一个高斯核进行卷积操作:
\[
I_\sigma = I * G_\sigma
\]
其中, \(*\) 表示卷积操作;\(G\) 表示标准差为 \(\sigma\) 的二维高斯核,定义为:
\[
G_\sigma = \frac{1}{2\pi \sigma^2} e^{-(x^2+y^2) / 2 \sigma^2}
\]
高斯模糊通常是其他图像处理操作的一部分,比如图像插值操作、兴趣点计算以及其他应用。
Scipy有用来做滤波操作的scipy.ndimage.filters模块。该模块使用快速一维分离的方式来计算卷积。使用方式:
from PIL import Image import numpy as np from scipy.ndimage import filters img = Image.open(r"girl.jpg").convert('L') img = np.array(img) img2 = filters.gaussian_filter(img, 2) img3 = filters.gaussian_filter(img, 5) img4 = filters.gaussian_filter(img, 10)绘制结果
上面使用的gaussian_filter()函数中的后一个参数表示标准差 \(\sigma\) ,可见随着 \(\sigma\) 的增加,图像变得越来越模糊。 \(\sigma\) 越大,处理后图像细节丢失越多。如果是打算模糊一幅彩色图像,只需要简单地对每一个颜色通道进行高斯模糊:
from PIL import Image import numpy as np from scipy.ndimage import filters img = Image.open(r"girl.jpg") img = np.array(img) img2 = np.zeros(img.shape) for i in range(img2.shape[2]): img2[:, :, i] = filters.gaussian_filter(img[:, :, i], 5) # 将像素值用八位表示 img2 = np.array(img2, 'uint8')模糊结果:
在很多应用中,图像强度的变化情况是非常重要的,强度的变化可以使用灰度图像的 \(x\) 和 \(y\) 方向导数 \(I_x\) 和 \(I_y\)进行描述
图像的梯度向量为 \(\bigtriangledown I = [I_x, I_y]^T\)。梯度有两个重要属性,一是梯度的大小:
\[
| \bigtriangledown I | = \sqrt{I_x^2 + I_y^2}
\]
它描述了图像强度变化的强弱,另一个是图像的角度:
\[
\alpha = arctan2(I_x, I_y)
\]
它描述了图像在每个点上强度变化最大的方向。Numpy中的arctan2()函数返回弧度表示的有符号角度,角度的变化区间为 \((-\pi, \pi)\)
可以使用离散近似的方式来计算图像的导数。图像倒数大多数可以通过卷积简单地实现:
\[
I_x = I*D_x 和 I_y = I*D_y
\]
对于 \(D_x\) 和 \(D_y\),通常选择Prewitt滤波器:
\[
D_x = \left[
\begin{matrix}
-1 & 0 & 1 \\
-1 & 0 & 1 \\
-1 & 0 & 1
\end{matrix}
\right]
\]
和
\[
D_y = \left[
\begin{matrix}
-1 & -1 & -1 \\
0 & 0 & 0 \\
1 & 1 & 1
\end{matrix}
\right]
\]
或者Sobel滤波器
\[
D_x = \left[
\begin{matrix}
-1 & 0 & 1 \\
-2 & 0 & 2 \\
-1 & 0 & 1
\end{matrix}
\right]
\]
和
\[
D_y = \left[
\begin{matrix}
-1 & -2 & -1 \\
0 & 0 & 0 \\
1 & 2 & 1
\end{matrix}
\right]
\]
这些导数滤波器可以使用scipy.ndimage.filters模块地标准卷积操作来简单地实现
sobel()函数的第二个参数选择 \(x\) 或 \(y\) 方向的导数,第三个参数保存输出变量。在图像中,正导数显示为亮的像素,负导数显示为暗的像素,灰色区域表示导数的值接近零。