PotatoPie 4.0 实验教程(27) —— FPGA实现摄像头图像拉普拉斯边缘提取-Anlogic-安路社区-FPGA CPLD-ChipDebug

PotatoPie 4.0 实验教程(27) —— FPGA实现摄像头图像拉普拉斯边缘提取

手机扫码

20240416075513933-1713225291635

链接直达

https://item.taobao.com/item.htm?ft=t&id=776516984361

拉普拉斯边缘提取有什么作用?

拉普拉斯边缘检测是一种常用的图像处理技术,用于检测图像中的边缘和边界。它的主要作用包括:

  1. 边缘检测:拉普拉斯算子可以帮助检测图像中的边缘,即图像中亮度快速变化的位置。这些边缘通常表示了图像中物体的轮廓和形状,因此边缘检测是许多图像处理和计算机视觉任务的基础,如物体检测、图像分割等。

  2. 特征提取:在图像处理和计算机视觉任务中,提取图像中的重要特征对于后续的分析和识别至关重要。边缘通常包含了很多有用的信息,通过拉普拉斯边缘检测可以提取这些边缘特征,用于图像的描述和分析。

  3. 图像增强:拉普拉斯边缘检测可以突出图像中的边缘和细节,从而使图像更加清晰和易于理解。这对于图像的增强和改善视觉效果是很有帮助的。

  4. 图像分割:图像分割是将图像划分为具有语义意义的区域或对象的过程。边缘通常是图像中不同区域之间的分界线,因此通过边缘检测可以帮助实现图像的分割。

总的来说,拉普拉斯边缘检测在图像处理和计算机视觉领域中有着广泛的应用,可以用于边缘检测、特征提取、图像增强和图像分割等任务。

拉普拉斯边缘检测的基本流程

边缘检测在图像处理和计算机视觉中扮演着重要角色,其目的是识别图像中亮度变化明显的点,这些变化往往反映了图像中重要的特征和结构。边缘检测的重要性体现在以下几个方面:

  1. 减少数据量: 边缘检测能够剔除图像中大量的非重要信息,从而减少数据量,提高处理效率。

  2. 保留重要结构: 边缘检测有助于保留图像中的重要结构信息,使得后续处理更加精确和高效。

  3. 特征提取: 边缘检测是特征提取的基础步骤之一,它可以帮助识别图像中的物体边界和轮廓,从而为目标识别、跟踪、分割等任务提供重要线索。

  4. 基于查找的方法: 这类方法通过查找图像一阶导数的最大和最小值来检测边缘,通常将边缘定位在梯度最大的方向。常见的基于查找的方法包括 Sobel、Prewitt 和 Roberts 等算子。

  5. 基于零穿越的方法: 这类方法通过寻找图像二阶导数的零穿越来寻找边缘,通常是在 Laplacian 过零点或者非线性差分表示的过零点。这些方法能够更加精确地定位边缘,但也更容易受到噪声的影响。

总的来说,边缘检测是图像处理和计算机视觉中的基础问题之一,对于提取图像的重要特征和结构具有重要意义,为许多图像分析和理解任务提供了基础。

拉普拉斯边缘检测是一种基于二阶导数的边缘检测方法。以下是其基本步骤:

  1. 灰度化:将输入的彩色图像转换为灰度图像。这可以通过取红、绿、蓝三个通道的平均值或者通过加权平均(比如用0.299R + 0.587G + 0.114*B)来实现。
  2. 高斯滤波:为了减少图像中的噪声对边缘检测的影响,通常先对图像进行高斯滤波,以平滑图像。高斯滤波器可以用来降低图像中高频部分的强度,保留图像中的低频部分。

  3. 拉普拉斯卷积:使用拉普拉斯算子(也称为拉普拉斯核)对图像进行卷积操作,以检测图像中的边缘。拉普拉斯算子是一个二阶导数算子,其一般形式为:在离散图像中,可以用以下拉普拉斯核进行卷积计算:

         0 -1  0
         -1 4 -1
          0 -1  0

       或者

           1 1 1
           1 -8 1
           1 1 1

      这两种核的选择通常取决于具体的应用需求。

    4. 边缘检测:在经过拉普拉斯卷积后的图像中,边缘会被放大成边缘点(或边缘线)。通常,我们会对结果应用阈值处理,将像素值大于某个阈值的点标记为边缘点,而小于阈值的点则忽略。

这些步骤组成了拉普拉斯边缘提取的基本流程,但具体实现时可能会根据应用需求和算法优化进行调整和修改。

灰度化前面的教程中提到过,高斯滤波我们后面会讲到,这个教程里为了分步演示FPGA处理效果,不进行高斯滤波和灰度处理。

python实现拉普拉斯边缘提取源代码

这段代码的功能是读取一个名为 “edge.png” 的彩色图像,将其转换为灰度图像,并对其应用拉普拉斯边缘检测算法,最后将结果图像显示出来。

具体步骤如下:

  1. 导入必要的 Python 库:导入了 OpenCV(cv2)、NumPy(np)、os 和 matplotlib.pyplot(plt)库。

  2. 读取输入图像并转换为灰度图像:使用 OpenCV 的 cv2.imread() 函数读取名为 “edge.png” 的彩色图像,然后使用 cv2.cvtColor() 函数将其转换为灰度图像。

  3. 初始化用于存储拉普拉斯边缘检测结果的图像:创建了一个与原始灰度图像相同大小的数组,用于存储拉普拉斯边缘检测结果。

  4. 计算拉普拉斯边缘检测值:遍历灰度图像的每个像素,对每个像素应用拉普拉斯算子,计算其边缘检测值。这里使用了拉普拉斯算子的离散形式来计算边缘检测值。

  5. 显示结果图像:使用 matplotlib 库将原始彩色图像、原始灰度图像和拉普拉斯边缘检测结果图像显示在一个图像窗口中,以便用户查看。

总的来说,这段代码完成了对彩色图像的灰度化处理以及拉普拉斯边缘检测,并将结果图像显示出来,帮助用户观察图像边缘的检测效果。

效果如下:

20240418133922379-image

matlab实现拉普拉斯边缘提取源代码

这段代码实现了以下功能:

  1. 从当前 MATLAB 脚本所在目录读取 ‘edge.png’ 图像。
  2. 将读取的彩色图像转换为灰度图像。
  3. 对灰度图像进行拉普拉斯边缘检测。
  4. 在一个图形窗口中显示原始彩色图像、原始灰度图像和拉普拉斯边缘检测结果图像。

实测效果图:

20240418132455979-image

20240418132426756-image

FPGA工程分析

工程层次图

20240418151241802-image

demo18相比,只是多了一个img_laplacian_fltr的模块,也就是下面这一段代码,在从SDRAM读出来之后,经它处理后再输出hdmi_tx模块。

img_laplacian_edge_det u_laplacian_edge
(
    .i_clk(clk_pixel),
    .i_rst_n(sys_rst_n),
    .i_hs(VGA_HS),
    .i_vs(VGA_VS),
    .i_de(VGA_DE),
    .i_r(VGA_RGB[23:16]),
    .i_g(VGA_RGB[15:8] ),
    .i_b(VGA_RGB[7:0]  ),          
    .o_hs(central_diff_hs),
    .o_vs(central_diff_vs),
    .o_de(central_diff_de),   
    .o_r(central_diff_data[23:16]),
    .o_g(central_diff_data[15:8] ),
    .o_b(central_diff_data[7:0]  )
);

img_laplacian_edge_det模块代码解析

img_laplacian_edge_det  与前一教程的《PotatoPie 4.0 实验教程(26) —— FPGA实现摄像头图像拉普拉斯锐化》的过程是一样的,唯一不同的是算子由

0 -1 0
-1 5 -1
0 -1 0

变成了

     0 -1  0
     -1 4 -1
      0 -1  0

其实这两个算子本身就是可以既做锐化又做边缘提取,二者本制进是一样的,故不再赘述。

实验结果

处理前

20240418143911634-image处理后:

可以看到边缘确实强化出来了,但是噪声也很大。

20240418143937241-1713422351972

请登录后发表评论

    没有回复内容