PotatoPie 4.0 实验教程(36) —— FPGA实现摄像头图像二值化开运算效果-Anlogic-安路论坛-FPGA CPLD-ChipDebug

PotatoPie 4.0 实验教程(36) —— FPGA实现摄像头图像二值化开运算效果

手机扫码

20240416075513933-1713225291635

链接直达

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

什么是图像开运算,有什么作用?

图像开运算是数学形态学中的一种图像处理操作,它由两个基本操作组成:腐蚀(Erosion)和膨胀(Dilation)。开运算的作用包括:

  1. 平滑图像:开运算可以去除图像中的小型噪声或孤立的像素点,从而使图像变得更加平滑。

  2. 去除小物体:开运算可以有效地去除图像中的小型物体或细小的结构,使得图像中的主要物体更加突出。

  3. 分离物体:开运算可以将图像中的不同物体分离开来,使它们之间的空隙变得更加明显,从而便于后续的分析和处理。

  4. 改善边缘:开运算可以改善图像中物体的边缘,使其更加清晰和连续。

总的来说,图像开运算可以帮助提取图像中的主要特征,去除噪声和不必要的细节,从而改善图像质量和提高后续图像处理算法的准确性。

图像开运算的算法步骤

图像开运算是由腐蚀操作和膨胀操作组成的。其算法步骤如下:

  1. 腐蚀(Erosion):对输入的二值图像进行腐蚀操作,通过滑动一个结构元素(kernel)在图像上,将该结构元素与图像中的像素进行逐像素的比较,如果结构元素覆盖的所有像素都为前景像素(白色),则将中心像素设置为前景像素,否则设置为背景像素(黑色)。

  2. 膨胀(Dilation):对腐蚀操作得到的图像进行膨胀操作,同样通过滑动结构元素在图像上,将结构元素覆盖的所有像素中的至少一个为前景像素的像素设置为前景像素。

  3. 将膨胀操作得到的图像减去腐蚀操作得到的图像,即可得到图像开运算的结果。

总的来说,图像开运算的算法步骤是先腐蚀后膨胀,通常用于去除小物体、平滑图像和改善边缘等应用场景。

Python实现图像二值化开运算源码

这段Python代码实现了图像的二值化、腐蚀和膨胀处理,并使用matplotlib库在子图中展示处理前后的图像。以下是对代码功能的详细说明:

  1. 读取图像:从当前.py文件所在目录读取名为”img_open.png”的图像,并转换为灰度图像。

  2. 图像二值化:将灰度图像进行阈值处理,大于阈值92的像素值设为255(白色),否则设为0(黑色),得到二值化图像。

  3. 腐蚀处理函数(image_erode):根据输入的迭代次数,在二值化图像上执行腐蚀操作。腐蚀的算法采用了基于像素值的逻辑判断,对图像中的每个像素点进行遍历,当其周围的8个像素点都为白色时,将当前像素点设为白色,否则设为黑色。

  4. 膨胀处理函数(image_dilate):根据输入的迭代次数,在二值化图像上执行膨胀操作。膨胀的算法也采用了基于像素值的逻辑判断,对图像中的每个像素点进行遍历,当其周围的8个像素点有一个或多个为白色时,将当前像素点设为白色,否则设为黑色。

  5. 图像处理过程:分别对腐蚀和膨胀处理进行多次迭代,得到不同次数的处理结果。

  6. 图像展示:使用matplotlib库在子图中展示原始灰度图像、二值化图像、腐蚀处理后的图像(0次、1次、2次)以及膨胀处理后的图像(0次、1次、2次)。

这段代码通过纯Python实现了图像处理过程,避免了使用OpenCV库中的膨胀和腐蚀函数,而是直接使用循环结构和逻辑判断来实现相应的操作。

可以看到经过两次腐蚀后,里面的白色小点已被消除,经过膨胀后 j 字符明显变粗了。  

20240420185733948-image

matlab实现图像二值化开运算源码

以上代码实现了图像的二值化、腐蚀和膨胀处理,并使用 MATLAB 的 imshowtitle 函数将处理结果以子图形式展示出来。下面对代码功能进行详细说明:

  1. 读取图像并转换为灰度图像

    • 使用 imread 函数读取名为 “Lena.jpg” 的图像文件。
    • 通过 rgb2gray 函数将彩色图像转换为灰度图像。
  2. 图像二值化处理

    • 遍历图像的每个像素,若像素的灰度值大于 92,则将其设置为白色(255),否则设置为黑色(0)。
  3. 图像腐蚀处理

    • 对二值化后的图像进行腐蚀处理,采用3×3的结构元素。
    • 使用按位与(&)操作符对结构元素覆盖区域内的像素进行处理。
  4. 图像膨胀处理

    • 对腐蚀后的图像进行膨胀处理,同样采用3×3的结构元素。
    • 使用按位或(|)操作符对结构元素覆盖区域内的像素进行处理。
  5. 图像显示

    • 使用 subplot 函数创建子图,分别显示原始灰度图像、二值化图像、腐蚀处理结果和膨胀处理结果。
    • 使用 imshow 函数显示图像,并用 title 函数为每幅图像添加标题,标题文字使用微软雅黑字体。

以上代码及注释详细说明了每个步骤的功能和实现方法。

可以看到经过两次腐蚀后,里面的白色小点已被消除,经过膨胀后 j 字符明显变粗了。  

20240420184310258-image

FPGA工程分析

工程层次图

20240420193101352-image

前面我们提到过开运算就是先腐蚀后膨胀,可以看到上面的层次图中分别有一个img_erosion_fltr和img_dlat_fltr, video_tpg_24b产生的数据先经过img_erosion_fltr处理,再经过img_dlat_fltr处理即完成了开运算,如下面的代码所示:

img_erosion_fltr u_img_erosion_fltr
(
    .i_clk          (clk_pixel              ),  
    .i_rst_n        (sys_rst_n              ),  
    .i_hs           (VGA_HS                 ),  
    .i_vs           (VGA_VS                 ),  
    .i_de           (VGA_DE                 ),  
    .i_bin          (v_bin                  ),  
    .o_hs           (erosion_hs             ),  
    .o_vs           (erosion_vs             ),  
    .o_de           (erosion_de             ),  
    .o_bin          (erosion_bin            )   
);

img_dlat_fltr u_img_dlat_fltr
(
    .i_clk          (clk_pixel              ),        
    .i_rst_n        (sys_rst_n              ),        
    .i_hs           (erosion_hs             ),        
    .i_vs           (erosion_vs             ),        
    .i_de           (erosion_de             ),        
    .i_bin          (erosion_bin            ),  
    .o_hs           (dlat_hs                ),  
    .o_vs           (dlat_vs                ),  
    .o_de           (dlat_de                ),  
    .o_bin          (dlat_bin               )   
);

管脚约束

PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。

时序约束

PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。

效果图

效果图就不发了,效果可以预见,哈哈。

请登录后发表评论

    没有回复内容