基本图像操作和处理(python) (2)

可见,直方图均衡化的图像的对比度增强了,原先图像灰色区域的斜街变得清晰。
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)

绘制结果

基本图像操作和处理(python)

上面使用的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')

模糊结果:

基本图像操作和处理(python)

在很多应用中,图像强度的变化情况是非常重要的,强度的变化可以使用灰度图像的 \(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模块地标准卷积操作来简单地实现

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) imgx = np.zeros(img.shape) # Sobel导数滤波器 filters.sobel(img, 1, imgx) imgy = np.zeros(img.shape) filters.sobel(img, 0, imgy) magnitude = np.sqrt(imgx**2+imgy**2)

基本图像操作和处理(python)

sobel()函数的第二个参数选择 \(x\)\(y\) 方向的导数,第三个参数保存输出变量。在图像中,正导数显示为亮的像素,负导数显示为暗的像素,灰色区域表示导数的值接近零。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwgyy.html