让我们将理论付诸实践。在前面的章节中,我们讨论了边缘作为强度显著变化的看法,并了解了Canny边缘检测器,这是一种常用且高效的算法,用于发现这些边缘。现在,我们将在Python中使用OpenCV库,将Canny算法应用于图像。请确保您的Python环境已按照第1章所述安装了OpenCV。您还需要Matplotlib以便轻松显示图像。如果您没有安装Matplotlib,通常可以使用pip进行安装:pip install matplotlib加载图像首先,我们需要一张图像来处理。选择一张具有清晰物体或结构的图像。将其保存在您的项目目录中。我们将从导入所需库并加载图像开始。对于边缘检测,通常的做法是使用灰度图像,因为颜色信息对于查找强度变化不是必需的。我们可以使用cv2.imread()直接以灰度模式加载图像。import cv2 import matplotlib.pyplot as plt # 以灰度模式加载图像 # 将 'your_image.jpg' 替换为你的图像文件的实际路径 image_path = 'your_image.jpg' gray_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # 检查图像是否成功加载 if gray_image is None: print(f"错误:无法从 {image_path} 加载图像") # 退出或进行适当的错误处理 else: print("图像加载成功。") # 你可能想在这里显示原始灰度图像(可选) # plt.imshow(gray_image, cmap='gray') # plt.title('原始灰度图像') # plt.axis('off') # 隐藏坐标轴刻度 # plt.show()请记住将'your_image.jpg'替换为您所选图像的文件名。cv2.IMREAD_GRAYSCALE标志告诉OpenCV在加载时将图像转换为单通道(灰度)。我们还添加了一个检查,以确保图像正确加载,这是一个好的做法。应用Canny边缘检测器加载灰度图像后,使用cv2.Canny()函数在OpenCV中应用Canny边缘检测器是直接的。我们需要提供的主要参数是:image:输入灰度图像(如我们的gray_image)。threshold1:滞后过程的较低阈值。threshold2:滞后过程的较高阈值。如前所述,Canny算法使用这两个阈值。强度梯度高于threshold2的边缘被认为是确定边缘。低于threshold1的边缘被舍弃。介于两个阈值之间的边缘只有在连接到确定边缘时才会被保留。选择这些阈值通常取决于应用,可能需要一些尝试。让我们从一些常用值开始,例如100和200。# 应用Canny边缘检测器 # 使用 threshold1=100 和 threshold2=200 作为起始值 edges = cv2.Canny(gray_image, 100, 200) # 变量 'edges' 现在包含边缘图图像 # 这是一个二值图像,其中白色像素表示检测到的边缘输出的edges是一个二值图像(只包含黑白像素),其中白色像素表示检测到的边缘位置。显示结果现在,让我们使用Matplotlib并排显示原始灰度图像和生成的边缘图,以便进行比较。import cv2 import matplotlib.pyplot as plt # --- 加载图像(同前) --- image_path = 'your_image.jpg' # 确保路径正确 gray_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) if gray_image is None: print(f"错误:无法从 {image_path} 加载图像") else: # --- 应用Canny(同前) --- threshold1 = 100 threshold2 = 200 edges = cv2.Canny(gray_image, threshold1, threshold2) # --- 显示结果 --- plt.figure(figsize=(10, 5)) # 设置图表大小 # 显示原始灰度图像 plt.subplot(1, 2, 1) # 1行,2列,图1 plt.imshow(gray_image, cmap='gray') plt.title('原始灰度图像') plt.axis('off') # 隐藏坐标轴刻度和标签 # 显示Canny边缘图 plt.subplot(1, 2, 2) # 1行,2列,图2 plt.imshow(edges, cmap='gray') plt.title(f'Canny边缘 (T1={threshold1}, T2={threshold2})') plt.axis('off') # 隐藏坐标轴刻度和标签 plt.tight_layout() # 调整布局以防止重叠 plt.show()运行此代码后,您应该会看到两张图像:您的原始灰度输入图像和Canny边缘图。边缘图应突出显示图像中的轮廓和显著的强度变化。尝试阈值边缘检测的质量很大程度上取决于threshold1和threshold2的值。降低阈值(例如,50, 150):这通常会检测到更多边缘,包括较弱的边缘。但是,它也可能拾取更多噪声和不那么重要的细节,使边缘图看起来杂乱。提高阈值(例如,150, 250):这将导致检测到的边缘数量减少,只保留较强的边缘。这对于减少噪声可能有用,但可能会导致您丢失更细微的边缘细节或较弱物体边界的一部分。尝试修改代码中的threshold1和threshold2值并重新运行。观察生成的边缘图如何变化。找到“最佳”阈值通常需要尝试几个值,直到获得适合该图像特定目标的结果。对于所有图像,没有一套完美无缺的阈值。这个动手实践练习展示了如何应用一种基本的特征检测方法。生成的边缘图简化了图像,保留了重要的结构信息,同时丢弃了不相关的细节。这种边缘信息对于许多后续的计算机视觉任务来说是宝贵的输入。