1.算法运行效果图预览
(完整程序运行后无水印)
将数据导入到matlab中显示图片:
可以看到,图3,通过FPGA细化之后,可以获得和MATLAB一样的效果(图2),两者相对于原图(图1)都实现了图像的细化处理。
2.算法运行软件版本
vivado2019.2
matlab2024b/matlab2022a
3.部分核心程序
(完整版代码包含详细中文注释和操作步骤视频)
initial begin i_clk=1; i_clk2d=1; i_rst=1; #1000; i_rst=0; end always #20 i_clk=~i_clk; always #5 i_clk2d=~i_clk2d;always@(posedge i_clk) beginII<=Buffer[idx];idx<=idx+1; endtops tops_u( .i_clk (i_clk), .i_clk2d (i_clk2d), .i_rst (i_rst), .i_I (II), .o_Ith (o_Ith) );integer fout1; initial beginfout1 = $fopen("SAVEDATA1.txt","w"); endalways @ (posedge i_clk)beginif(idx<=66614 & idx>=2)$fwrite(fout1,"%d\n",o_Ith);else$fwrite(fout1,"%d\n",0); endendmodule
4.算法理论概述
用骨架来表示线划图像能够有效地减少数据量,减少图像的存储难度和识别难度。线划图(包括纸质地图、线画稿、手绘图等)的存储是非常麻烦的,存储和使用起来都很不方便。例如,一张A4大小的线划图存储需要1M的容量,另外一些比较严重的问题就是数据的修改、更新和显示。矢量化是解决这些问题的方法,但这些图的宽度经常是大于一个像素的,这会导致矢量化结果有非常大的问题,为了解决这些问题,细化就成了模式识别和矢量化的先决条件。
图像细化是一项重要的预处理技术,广泛应用于字符识别、指纹识别、医学图像分析等众多领域。通过图像细化,可以将二值图像中的线条或物体轮廓简化为单像素宽度的骨架,从而保留其基本的拓扑结构和形状信息,同时减少数据量,提高后续处理的效率和准确性。Zhang-Suen算法是一种经典的图像细化算法,由Zhang和Suen于1984年提出,该算法具有计算简单、细化效果好、能较好地保持图像的拓扑结构等优点,因此在实际应用中得到了广泛的应用。
Zhang-Suen 算法是一种迭代的细化算法,其基本思想是通过反复迭代,逐步删除图像中不符合条件的前景像素,直到无法再删除为止,从而得到图像的细化结果。在每次迭代中,算法分为两个子迭代步骤,分别对图像中的前景像素进行检查和删除操作。
Zhang-Suen算法是针对二值图像设计的,对于彩色图像和灰度图像,需要先将其转换为二值图像,然后再进行细化处理。可以采用一些自适应阈值分割方法将彩色图像和灰度图像转换为二值图像,然后再应用 Zhang-Suen 算法进行细化。
Zhang-Suen算法每运行一次,都需要遍历所有的不为0的像素。在对每个像素(P1)进行删除或保留的判断时,我们需要关注其周围的8个邻居像素(P2, P3, P4, P5, P6, P7, P8)的值。其中 P2到 P8的顺序是算法规定,用于判断,共分为两个步骤来判断该点是否需要删除。
如果像素p同时满足以上四个条件,则将该像素标记为待删除像素。然后,将所有标记为待删除的像素删除。Zhang-Suen 算法能够较好地保持图像的拓扑结构,细化后的图像为单像素宽度的骨架,且骨架的位置和形状与原始图像的轮廓基本一致。但是,该算法在处理一些复杂图像时,可能会出现骨架不连续、产生毛刺等问题。