7.2 锐化
图像锐化(Image sharpening)是一种图像处理技术,旨在增强图像的边缘和细节,使图像看起来更加清晰和鲜明。锐化技术通过增加图像的高频分量来突出边缘和细节,从而改善图像的视觉质量。图像锐化的主要目标是增强图像中的边缘信息。边缘是图像中灰度值变化较大的区域,通常表示物体的边界或纹理。通过突出边缘,图像锐化技术可以使图像看起来更加清晰,细节更加突出。
在现实应用中,有以下几种常见的图像锐化方法:
- 锐化滤波器:锐化滤波器是一种常用的图像锐化技术,通过增强高频分量来提高图像的清晰度。常见的锐化滤波器包括拉普拉斯滤波器和高通滤波器(如Sobel滤波器和Prewitt滤波器)。这些滤波器通过在图像上应用卷积操作来增强边缘。
- 高频强调滤波:高频强调滤波是一种通过增强图像的高频成分来实现图像锐化的技术。它基于图像锐化的原理,将原始图像与其低通滤波结果进行相减,从而突出高频细节。常用的高频强调滤波器包括Unsharp Masking和细节增强。
- 基于梯度的锐化:基于梯度的锐化方法利用图像的梯度信息来增强边缘。梯度是图像灰度变化最大的区域,通常与边缘相对应。通过计算图像的梯度,可以突出图像中的边缘信息。常见的基于梯度的锐化方法包括Sobel算子和Canny边缘检测算法。
Python中有多种库可以实现图像锐化,例如OpenCV和PIL(Python Imaging Library)。使用这些库,可以方便地应用各种图像锐化技术来增强图像的清晰度和细节。具体使用那种方法实现图像锐化功能,取决于所选择的库和方法。
7.2.1 锐化滤波器
锐化滤波器(Sharpening filter)是一种常用的图像处理技术,用于增强图像的边缘和细节,以提高图像的清晰度和视觉效果。锐化滤波器通过增强图像中的高频分量来突出边缘,从而使图像看起来更加清晰和鲜明。在图像处理中,常见的锐化滤波器包括拉普拉斯滤波器和高通滤波器,如Sobel滤波器和Prewitt滤波器。
- 拉普拉斯滤波器:是一种常用的锐化滤波器,用于增强图像的边缘信息。它通过对图像进行二阶微分来检测边缘,然后将检测到的边缘添加回原始图像以增强边缘。在实现时,常用的拉普拉斯滤波器有3x3和5x5两种核。
- Sobel滤波器:是一种常用的高通滤波器,用于检测图像中的边缘。通过计算图像的梯度来确定像素值的变化情况,并突出边缘。Sobel滤波器分为水平和垂直两个方向,可以分别检测图像中的水平和垂直边缘。通过对这两个方向的边缘进行组合,可以得到更全面的边缘检测结果。
Python中,可以使用库OpenCV来实现锐化滤波器。
(1)使用拉普拉斯滤波器实现图像锐化
例如在下面的实例中,演示了使用拉普拉斯滤波器实现图像锐化的过程。
实例7-9:使用拉普拉斯滤波器实现图像锐化
源码路径:daima\7\purui.py
import cv2
import numpy as np
# 读取图像
image = cv2.imread('888.jpg', cv2.IMREAD_GRAYSCALE)
# 定义拉普拉斯滤波器
laplacian_kernel = np.array([[0, 1, 0],
[1, -4, 1],
[0, 1, 0]], dtype=np.float32)
# 对图像应用拉普拉斯滤波器
sharpened_image = cv2.filter2D(image, -1, laplacian_kernel)
# 将像素值归一化到0到255范围内
sharpened_image = (255 * (sharpened_image - np.min(sharpened_image)) / (np.max(sharpened_image) - np.min(sharpened_image))).astype(np.uint8)
# 显示原始图像和锐化后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Sharpened Image", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代码中,首先使用函数cv2.imread()读取图像,并将其转换为灰度图像。然后定义一个3x3的拉普拉斯滤波器作为卷积核。通过使用函数cv2.filter2D()对图像应用拉普拉斯滤波器,可以得到锐化后的图像。最后,将锐化后的图像像素值归一化到0到255范围内,并显示原始图像和锐化后的图像。注意,在本实例中将锐化后的图像的像素值归一化到0到255的范围内,并将其转换为np.uint8类型。但是,如果原始图像的像素值范围本身已经是0到255之间,那么进行归一化可能会导致所有的像素值都变为0,从而得到一片黑色的图像。此时可以尝试去掉像素值归一化的步骤,直接使用滤波后的图像进行显示。以下是修改后的代码:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('888.jpg', cv2.IMREAD_GRAYSCALE)
# 定义拉普拉斯滤波器
laplacian_kernel = np.array([[0, 1, 0],
[1, -4, 1],
[0, 1, 0]], dtype=np.float32)
# 对图像应用拉普拉斯滤波器
sharpened_image = cv2.filter2D(image, -1, laplacian_kernel)
# 显示原始图像和锐化后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Sharpened Image", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
执行效果如图7-6所示。
图7-6 执行效果
(2)使用Sobel滤波器实现图像锐化
例如在下面的实例中,使用Sobel滤波器计算图像的梯度,并通过加权合并水平和垂直梯度来实现图像的锐化效果。我们可以尝试在代码中修改参数,如调整权重值、修改滤波器的大小等,以获得不同的锐化效果。
实例7-10:使用Sobel滤波器实现图像锐化
源码路径:daima\7\srui.py
import cv2
# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 计算水平方向和垂直方向的梯度
gradient_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
gradient_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
# 合并梯度
sharpened_image = cv2.addWeighted(gradient_x, 0.5, gradient_y, 0.5, 0)
# 显示原始图像和锐化后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Sharpened Image", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
对上述代码的具体说明如下:
- 导入库:首先导入了OpenCV库,它提供了图像处理和计算机视觉相关的功能。
- 读取图像:使用cv2.imread()函数读取名为'image.jpg'的图像,并通过cv2.IMREAD_GRAYSCALE参数将其转换为灰度图像。
- 计算梯度:通过使用Sobel滤波器计算图像的水平和垂直方向的梯度。cv2.Sobel()函数接受几个参数:第一个参数是输入图像,第二个参数是输出图像的数据类型(这里使用cv2.CV_64F表示64位浮点数),第三个和第四个参数分别是水平和垂直方向的导数阶数,最后一个参数是滤波器的大小(这里使用3x3的滤波器)。
- 合并梯度:通过使用cv2.addWeighted()函数将水平和垂直方向的梯度进行加权合并。这里将两个梯度图像按照相等的权重(0.5)进行加权合并,并将结果存储在sharpened_image变量中。
- 显示图像:使用cv2.imshow()函数显示原始图像和锐化后的图像。cv2.waitKey(0)函数等待用户按下任意键来关闭显示窗口。最后,使用cv2.destroyAllWindows()函数关闭所有的显示窗口。
7.2.2 高频强调滤波
高频强调滤波(High-Frequency Emphasis Filtering)是一种图像增强技术,用于增强图像中的高频细节和边缘。高频强调滤波通过突出图像的高频分量,使细节更加清晰和明显。Python语言实现高频强调滤波的方法主要包括以下几种:
(1)理想高通滤波器
- 使用傅里叶变换将图像转换到频域。
- 在频域中,使用理想高通滤波器将低频分量设置为零,保留高频分量。
- 将频域图像通过傅里叶反变换转换回空域图像。
例如下面是一个使用理想高通滤波器实现高频强调滤波的例子。
实例7-11:使用理想高通滤波器实现高频强调滤波
源码路径:daima\7\gaotong.py
import cv2
import numpy as np
def ideal_highpass_filter(image, cutoff):
# 将图像转换到频域
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 构建理想高通滤波器
rows, cols = image.shape
center_row, center_col = rows // 2, cols // 2
distance = np.sqrt((np.arange(rows)[:, np.newaxis] - center_row) ** 2 +
(np.arange(cols) - center_col) ** 2)
highpass = np.ones_like(image)
highpass[distance <= cutoff] = 0
# 应用滤波器
dft_shift_filtered = dft_shift * highpass[:, :, np.newaxis]
# 将频域图像转换回空域
dft_filtered_shifted = np.fft.ifftshift(dft_shift_filtered)
filtered_image = cv2.idft(dft_filtered_shifted)
filtered_image = cv2.magnitude(filtered_image[:, :, 0], filtered_image[:, :, 1])
# 保持原始图像的亮度范围
filtered_image = filtered_image * 255 / np.max(filtered_image)
return filtered_image.astype(np.uint8)
# 读取图像
image = cv2.imread('888.jpg', cv2.IMREAD_GRAYSCALE)
# 应用理想高通滤波器
enhanced_image = ideal_highpass_filter(image, cutoff=50)
# 显示原始图像和增强后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Enhanced Image", enhanced_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代码中,使用函数ideal_highpass_filter()实现了理想高通滤波器。首先将图像转换到频域,然后构建理想高通滤波器,将低频分量设为零。接下来,将滤波器应用于频域图像,并将结果转换回空域图像。然后,使用函数cv2.imread()读取图像,并将其转换为灰度图像。调用函数ideal_highpass_filter(),传入图像和截止频率cutoff进行理想高通滤波。最后,使用函数cv2.imshow()显示原始图像和增强后的图像。我们也可以尝试调整截止频率的值cutoff,以获得不同的高频强调效果。较低的截止频率会保留更多的低频分量,而较高的截止频率会突出高频细节。执行效果如图7-7所示。
图7-7 执行效果
(2)巴特沃斯高通滤波器:类似于理想高通滤波器,但巴特沃斯高通滤波器提供了平滑的过渡区域,避免了理想滤波器的陡峭截止。例如下面是一个使用巴特沃斯高通滤波器实现高频强调滤波的例子。
实例7-12:使用巴特沃斯高通滤波器实现高频强调滤波
源码路径:daima\7\bate.py
import cv2
import numpy as np
def high_frequency_emphasis(image, alpha, cutoff):
# 将图像转换到频域
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 构建巴特沃斯高通滤波器
rows, cols = image.shape
center_row, center_col = rows // 2, cols // 2
distance = np.sqrt((np.arange(rows)[:, np.newaxis] - center_row) ** 2 +
(np.arange(cols) - center_col) ** 2)
highpass = 1 / (1 + (cutoff / distance) ** (2 * alpha))
# 应用滤波器
dft_shift_filtered = dft_shift * highpass[:, :, np.newaxis]
# 将频域图像转换回空域
dft_filtered_shifted = np.fft.ifftshift(dft_shift_filtered)
filtered_image = cv2.idft(dft_filtered_shifted)
filtered_image = cv2.magnitude(filtered_image[:, :, 0], filtered_image[:, :, 1])
# 保持原始图像的亮度范围
filtered_image = filtered_image * 255 / np.max(filtered_image)
return filtered_image.astype(np.uint8)
# 读取图像
image = cv2.imread('888.jpg', cv2.IMREAD_GRAYSCALE)
# 应用高频强调滤波
enhanced_image = high_frequency_emphasis(image, alpha=2, cutoff=50)
# 显示原始图像和增强后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Enhanced Image", enhanced_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代码中,首先定义了一个名为high_frequency_emphasis()的函数,它接受输入图像、强调参数alpha和截止频率cutoff作为输入。该函数实现了巴特沃斯高通滤波器的过程,包括傅里叶变换、滤波器构建、滤波和逆傅里叶变换等步骤。然后,使用函数cv2.imread()读取图像,并将其转换为灰度图像。接下来,调用函数high_frequency_emphasis(),传入图像和参数进行高频强调滤波。最后,使用函数cv2.imshow()显示原始图像和增强后的图像。也可以尝试调整参数alpha和参数cutoff的值,以获得不同的高频强调效果。执行效果如图7-8所示。
图7-8 执行效果
(3)带通滤波器:通过将低频和高频分量同时保留,滤波掉中间频率的分量,从而突出高频细节。例如下面是一个使用带通滤波器实现高频强调滤波的例子。
实例7-13:使用带通滤波器实现高频强调滤波
源码路径:daima\7\dai.py
import cv2
import numpy as np
def bandpass_filter(image, low_cutoff, high_cutoff):
# 将图像转换到频域
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 构建带通滤波器
rows, cols = image.shape
center_row, center_col = rows // 2, cols // 2
distance = np.sqrt((np.arange(rows)[:, np.newaxis] - center_row) ** 2 +
(np.arange(cols) - center_col) ** 2)
bandpass = np.zeros_like(image)
bandpass[(distance >= low_cutoff) & (distance <= high_cutoff)] = 1
# 应用滤波器
dft_shift_filtered = dft_shift * bandpass[:, :, np.newaxis]
# 将频域图像转换回空域
dft_filtered_shifted = np.fft.ifftshift(dft_shift_filtered)
filtered_image = cv2.idft(dft_filtered_shifted)
filtered_image = cv2.magnitude(filtered_image[:, :, 0], filtered_image[:, :, 1])
# 保持原始图像的亮度范围
filtered_image = filtered_image * 255 / np.max(filtered_image)
return filtered_image.astype(np.uint8)
# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用带通滤波器
enhanced_image = bandpass_filter(image, low_cutoff=20, high_cutoff=80)
# 显示原始图像和增强后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Enhanced Image", enhanced_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
对上述代码的具体说明如下:
- 函数bandpass_filter()实现了带通滤波器的过程。首先将图像转换到频域,然后构建一个二值滤波器,其中在低截止频率和高截止频率之间的频率范围内取值为1,其他地方为0。接下来,将滤波器应用于频域图像,并将结果转换回空域图像。
- 然后,使用函数cv2.imread()读取图像,并将其转换为灰度图像。调用函数bandpass_filter(),传入图像和截止频率范围进行带通滤波。
- 最后,使用函数cv2.imshow()显示原始图像和增强后的图像。可以尝试调整低截止频率和高截止频率的值,以获得不同的高频强调效果。较小的截止频率会保留更多的低频分量,较大的截止频率会突出高频细节。
7.2.3 基于梯度的锐化
基于梯度的锐化是一种图像增强技术,通过突出图像中的边缘和细节来增强图像的清晰度和锐度。该方法基于图像的梯度信息,利用梯度的变化来增强图像的边缘。
在基于梯度的锐化方法中,常用的操作包括边缘检测和梯度增强。边缘检测算法可用于提取图像中的边缘信息,如Sobel、Prewitt和Canny等。梯度增强算法可增强图像中的边缘,如拉普拉斯算子、高频增强滤波器等。
(1)Sobel算子
Sobel算子是一种常用的边缘检测算子,用于在图像中寻找边缘的位置和方向。它是基于图像中的灰度变化率来进行边缘检测的。Sobel算子分别计算了图像在水平和垂直方向上的一阶导数。通过计算这两个方向上的梯度,可以获取图像中的边缘信息。Sobel算子是基于离散卷积的操作,它在图像的每个像素上应用一个3*3的卷积核。Sobel算子的卷积核如下所示:
| -1 0 1 |
Sx = | -2 0 2 |
| -1 0 1 |
| -1 -2 -1 |
Sy = | 0 0 0 |
| 1 2 1 |
其中,Sx代表水平方向的Sobel算子,Sy代表垂直方向的Sobel算子。
Sobel算子的运算过程如下:
- 对图像进行灰度转换(如果图像不是灰度图像)。
- 分别使用Sx和Sy卷积核对图像进行卷积操作,得到水平和垂直方向上的梯度值。
- 计算每个像素的梯度幅值和方向:
- 梯度幅值:sqrt(Sx^2 + Sy^2)
- 梯度方向:atan2(Sy, Sx)
- 对梯度幅值进行阈值处理,以提取边缘。
- 根据需要,可将提取的边缘绘制在图像上或进行其他后续处理。
Sobel算子可用于边缘检测、图像锐化、特征提取等图像处理任务。它的优点是简单高效,并且对噪声具有一定的抑制作用。例如在下面的实例演示了使用Sobel算子实现基于梯度的锐化的过程。
实例7-14:使用Sobel算子实现基于梯度的锐化
源码路径:daima\7\sobel.py
import numpy as np
def sobel_sharpen(image):
# 计算水平和垂直方向的梯度
gradient_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
gradient_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
# 取绝对值并合并梯度
gradient_x = cv2.convertScaleAbs(gradient_x)
gradient_y = cv2.convertScaleAbs(gradient_y)
gradient = cv2.addWeighted(gradient_x, 0.5, gradient_y, 0.5, 0)
# 对原始图像和梯度图像进行加权叠加
sharpened_image = cv2.addWeighted(image, 0.5, gradient, 0.5, 0)
return sharpened_image
# 读取图像
image = cv2.imread('888.jpg', cv2.IMREAD_GRAYSCALE)
# 应用Sobel算子进行锐化
sharpened_image = sobel_sharpen(image)
# 显示原始图像和锐化后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Sharpened Image (Sobel)", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
对上述代码的具体说明如下:
- 定义函数sobel_sharpen(),该函数接受一个灰度图像作为输入,并返回锐化后的图像。
- 在函数sobel_sharpen()内部,使用函数cv2.Sobel()计算了图像在水平和垂直方向上的梯度。其中,gradient_x表示水平方向的梯度,gradient_y表示垂直方向的梯度。cv2.CV_64F指定了输出图像的数据类型为64位浮点数。
- 使用cv2.convertScaleAbs函数对梯度图像进行绝对值转换,并将结果存储在gradient_x和gradient_y中。这一步是为了保证梯度图像的数值范围在0到255之间。
- 使用cv2.addWeighted函数将水平和垂直方向上的梯度图像进行加权叠加,得到合并后的梯度图像。这里设置了相同的权重0.5,表示对两个梯度图像进行平均。
- 最后,使用cv2.addWeighted函数将原始图像和合并后的梯度图像进行加权叠加,得到最终的锐化图像。这里也设置了相同的权重0.5,表示对两个图像进行平均。
- 在主程序中,首先使用cv2.imread函数读取了一张灰度图像(假设文件名为'image.jpg')。
- 调用sobel_sharpen函数对图像进行锐化,得到锐化后的图像sharpened_image。
- 使用cv2.imshow函数显示原始图像和锐化后的图像。
- 使用cv2.waitKey(0)等待用户按下任意键后关闭显示窗口。
- 最后使用cv2.destroyAllWindows函数关闭所有显示窗口。
总体来说,该代码通过计算图像的梯度,并将梯度图像与原始图像进行加权叠加,实现了对图像的锐化处理。
(2)Laplacian算子
Laplacian算子是一种常用的边缘检测算子,用于在图像中寻找边缘的位置和方向。它基于图像中的二阶导数,可以更好地捕捉到图像中的高频变化。Laplacian算子对图像进行了二次微分运算,从而可以检测出图像中的局部变化和突变。它在图像的每个像素点上应用了一个拉普拉斯模板(通常是3x3的模板),计算图像中的像素值与其周围像素值之间的差异。
Laplacian算子的卷积核如下所示:
| 0 1 0 |
L = | 1 -4 1 |
| 0 1 0 |
其中,L代表Laplacian算子。例如在下面的实例演示了使用Laplacian算子实现基于梯度的锐化的过程。
实例7-15:使用Laplacian算子实现基于梯度的锐化
源码路径:daima\7\lap.py
import cv2
def laplacian_sharpen(image):
# 应用拉普拉斯算子进行锐化
laplacian = cv2.Laplacian(image, cv2.CV_64F)
sharpened_image = cv2.convertScaleAbs(image - laplacian)
return sharpened_image
# 读取图像
image = cv2.imread('888.jpg', cv2.IMREAD_GRAYSCALE)
# 应用Laplacian算子进行锐化
sharpened_image = laplacian_sharpen(image)
# 显示原始图像和锐化后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Sharpened Image (Laplacian)", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
对上述代码的具体说明如下:
- 定义了laplacian_sharpen函数,该函数接受一个灰度图像作为输入,并返回锐化后的图像。
- 在laplacian_sharpen函数内部,使用cv2.Laplacian函数对图像应用了Laplacian算子。其中,cv2.CV_64F指定了输出图像的数据类型为64位浮点数。
- 使用cv2.convertScaleAbs函数将Laplacian算子的结果取绝对值并转换为无符号8位整数,得到锐化后的图像sharpened_image。
- 在主程序中,首先使用cv2.imread函数读取了一张灰度图像(假设文件名为'image.jpg')。
- 调用laplacian_sharpen函数对图像进行锐化,得到锐化后的图像sharpened_image。
- 使用cv2.imshow函数显示原始图像和锐化后的图像。
- 使用cv2.waitKey(0)等待用户按下任意键后关闭显示窗口。
- 最后使用cv2.destroyAllWindows函数关闭所有显示窗口。
总体来说,上述代码使用Laplacian算子对图像进行了二次微分操作,通过计算图像的二阶导数来实现图像的锐化处理。
(3)高频增强滤波器
高频增强滤波器是一种用于增强图像高频信息的滤波器。在图像处理中,高频成分通常对应着图像的细节和边缘信息。通过增强高频成分,可以使图像的细节更加清晰和突出。高频增强滤波器的原理是通过减小图像中的低频成分,从而增强高频成分。
在Python中,可以使用NumPy和OpenCV等库来实现高频增强滤波器。具体的实现方法可能会根据所选择的滤波器类型而有所不同,如使用巴特沃斯滤波器、高斯滤波器或理想滤波器等。这些滤波器通常需要通过设置参数,如截止频率、阶数或滤波器大小等来调整滤波器的性能。例如下面是一个实例代码,演示了如何使用高斯滤波器实现高频增强滤波器的过程。
实例7-16:使用高斯滤波器实现高频增强滤波器
源码路径:daima\7\gao.py
import cv2
import numpy as np
def high_frequency_enhancement(image, sigma):
# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用高斯滤波平滑图像
blurred_image = cv2.GaussianBlur(gray_image, (0, 0), sigma)
# 计算图像的细节部分
detail_image = gray_image - blurred_image
# 对细节部分进行增强
enhanced_image = gray_image + detail_image
return enhanced_image
# 读取图像
image = cv2.imread('888.jpg')
# 设置高斯滤波器的标准差
sigma = 3.0
# 应用高频增强滤波器
enhanced_image = high_frequency_enhancement(image, sigma)
# 显示原始图像和增强后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Enhanced Image', enhanced_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代码中,使用高斯滤波器对图像进行平滑处理,并计算出图像的细节部分。然后,将细节部分加回到原始图像中,得到增强了高频信息的图像。通过调整高斯滤波器的标准差参数,可以控制平滑的程度和高频增强的效果。执行效果如图7-9所示。
图7-9 执行效果