计算机视觉-边缘检测实验报告

实验一 边缘检测实验

一、实验目的

1.理解并掌握 Sobel 算子和 Canny 算子的基本原理和应用。

2.学习如何在图像处理中使用这两种算子进行边缘检测。

3.比较 Sobel 算子和 Canny 算子的性能,了解各自的优缺点。

4.学会使用图像处理工具或编程语言实现 Sobel 和 Canny 算子。

二、实验内容和要求

1.实验内容:

选择图像数据:从现有的图像数据集中选择适当的图像作为实验对象,确保图像包含明显的边缘结构以便进行边缘检测。

Sobel 边缘检测:使用 Sobel 算子对选定的图像进行边缘检测。这包括计算图像的水平和垂直方向的梯度,并计算梯度幅值,最终得到边缘检测结果。

Canny 边缘检测:使用 Canny 算子对同样的图像进行边缘检测。Canny 算子包括多个步骤,如高斯滤波、梯度计算、非极大值抑制和双阈值化,最终得到边缘检测结果。

2.基本要求:

(1)选择一组图像数据作为实验对象。

(2)使用 Sobel 算子对图像进行边缘检测,并记录结果。

(3)使用 Canny 算子对图像进行边缘检测,并记录结果。

(4)比较两种方法的边缘检测效果,分析其差异。

三、实验设备

实验设备主要有:计算机、OpenCV库

四、实验 原理

边缘检测是图像处理和机器视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式如下图所示:

图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于搜索和基于零穿越。

基于搜索:通过寻找图像一阶导数中的最大值来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值,代表算法是Sobel算子。

基于零穿越:通过寻找图像二阶导数零穿越来寻找边界,代表算法是Canny算子。

五、实验步骤

Sobel检测算子

Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是效率要求较高,而对细纹理不太关心的时候。

代码:

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

def Sobel_demo():
    img = cv2.imread("C:\\Users\\aslon\\Desktop\\louna.jpg")
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # Sobel算子
    x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0)
    y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1)
    # 转成uint8
    absX = cv2.convertScaleAbs(x)
    absY = cv2.convertScaleAbs(y)
    Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
    # 显示图形
    titles = ["Original Image", "Sobel Image"]
    images = [img, Sobel]
    for i in range(2):
        plt.subplot(1, 2, i+1)
        plt.imshow(images[i], "gray")
        plt.title(titles[i])
        plt.axis('off')
    plt.show()
    
Sobel_demo()
原图及代码执行结果:

Canny边缘检测

Canny 算子是一种更为复杂的边缘检测算法,它具有以下优点:

低错误率:能够尽可能少地检测出虚假边缘,同时尽可能多地检测出真实边缘。高定位精度:检测到的边缘位置准确。最小响应:对单个边缘仅有一个响应。

步骤:1、读取图像并将其转换为灰度图像。2、对灰度图像进行高斯模糊,以减少噪声。3、使用 Canny 算子检测边缘。

代码:

python 复制代码
def Canny_demo():
    img = cv2.imread("C:\\Users\\aslon\\Desktop\\louna.jpg")
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 高斯滤波
    img_GaussianBlur = cv2.GaussianBlur(gray, (3,3), 0)
    # Canny算子
    Canny = cv2.Canny(img_GaussianBlur, 0, 100)
    # 显示图形
    titles = ["Original Image", "Canny Image"]
    images = [img, Canny]
    for i in range(2):
        plt.subplot(1, 2, i+1)
        plt.imshow(images[i], "gray")
        plt.title(titles[i])
        plt.axis('off')
    plt.show()

Canny_demo()
原图及 代码执行结果:

、实验 总结

Canny算子与Sobel算子的差异对比:

Canny 算子:具有较高的检测精度,能够检测出更细、更准确的边缘,对弱边缘的检测也相对较好。抗噪性较强,在进行边缘检测之前会先进行高斯滤波等降噪处理,减少噪声对边缘检测的影响。

Sobel 算子:检测精度相对较低,边缘可能比较粗糙,对于一些弱边缘可能无法准确检测。Sobel 算子:抗噪性较弱,对噪声比较敏感,容易将噪声误检测为边缘。

相关推荐
上理考研周导师16 分钟前
【单片机原理】第1章 微机基础知识,运算器,控制器,寄存器,微机工作过程,数制转换
算法
檀越剑指大厂22 分钟前
【Python系列】Python中的`any`函数:检查“至少有一个”条件满足
开发语言·python
程序员黄同学1 小时前
如何使用 Python 连接 MySQL 数据库?
数据库·python·mysql
I_Am_Me_1 小时前
【JavaEE初阶】线程安全问题
开发语言·python
IT猿手1 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
张叔zhangshu1 小时前
TensorFlow 的基本概念和使用场景
人工智能·python·tensorflow
运维&陈同学1 小时前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
新手小袁_J2 小时前
实现Python将csv数据导入到Neo4j
数据库·python·neo4j·《我是刑警》·python连接neo4j·python导入csv·csv数据集导入neo4j
清风ꦿ2 小时前
neo4j 图表数据导入到 TuGraph
python·neo4j·knowledge graph
深度学习lover5 小时前
[项目代码] YOLOv8 遥感航拍飞机和船舶识别 [目标检测]
python·yolo·目标检测·计算机视觉·遥感航拍飞机和船舶识别