PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头图像二值化腐蚀效果-Anlogic-安路社区-FPGA CPLD-ChipDebug

PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头图像二值化腐蚀效果

手机扫码

20240416075513933-1713225291635

链接直达

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

图像二值化腐蚀处理有什么作用?

图像二值化腐蚀处理在图像处理中起到了以下作用:

  1. 物体分割与提取:在图像二值化之后,通过腐蚀操作可以消除噪声、连接相邻的物体,并使得物体的边界更加清晰,从而更容易对物体进行分割和提取。

  2. 图像细化:对于二值图像中的细长对象或者凹陷部分,腐蚀操作可以使得这些部分变得更加细长,达到细化的效果,有助于后续的图像分析和处理。

  3. 图像形态学处理:腐蚀操作是形态学图像处理中的基本操作之一,通过腐蚀可以改变图像的形状和结构,使得后续的处理更加精确和准确。

  4. 图像预处理:在图像处理的预处理阶段,二值化腐蚀处理可以使得图像更加规范化和标准化,为后续的特征提取、目标检测等操作提供更好的图像基础。

总的来说,图像二值化腐蚀处理可以提高图像的质量,增强图像的特征,从而更好地适应各种图像处理和分析任务的需求。

图像二值化腐蚀的算法和步骤

图像二值化腐蚀是图像处理中常用的一种形态学操作,其算法和步骤如下:

  1. 二值化:首先将输入的灰度图像进行二值化处理,将图像转换为黑白二值图像。二值化操作可以根据阈值将图像中的像素分为两类,一类是大于阈值的像素(前景),另一类是小于等于阈值的像素(背景)。

  2. 结构元素:定义一个结构元素,通常是一个小的二值化图像,用来表示腐蚀的形状和大小。结构元素可以是任意形状,常见的包括矩形、圆形、十字形等。

  3. 腐蚀操作:对二值化后的图像进行腐蚀操作。腐蚀操作的原理是用结构元素在图像上滑动,如果结构元素完全覆盖了前景区域(像素值为1),则中心像素的值保持为1;否则,中心像素的值被置为0。这样可以使得前景区域逐渐收缩,边界变得更加平滑,孔洞变得更小。

  4. 重复操作:根据具体的需求,可以多次进行腐蚀操作,以进一步缩小前景区域的大小或填充小的孔洞。每次腐蚀操作都会使前景区域缩小,直到达到预期的效果为止。

  5. 输出结果:腐蚀操作结束后,得到经过二值化腐蚀处理的图像,可以用于后续的图像分析、特征提取或目标检测等任务。

总的来说,图像二值化腐蚀的算法步骤简单清晰,通过不断缩小前景区域的像素来实现对图像的处理和特征增强。

我们下需展示的源码是使用的结构元素实为3*3的模板,具体操作是当这九个像素点全为白色(“1”) 时输出白色(“1”), 否则输出黑色(“0”)。 优化成逻辑,就是使用逻辑与运算对这9个像素进行位与操作。 

python代码实现图像二值化腐蚀源码

这段代码实现了图像的二值化和腐蚀处理,并通过Matplotlib库将处理后的图像显示出来。

  1. 图像二值化处理

    • 通过循环遍历图像的每个像素,判断其灰度值是否大于阈值92,若大于则将像素值设为255(白色),否则设为0(黑色),从而将图像转换为二值图像。
  2. 腐蚀处理

    • 分别对二值化后的图像进行了三次腐蚀处理,每次腐蚀操作都是基于逻辑运算的操作。
    • 在腐蚀操作中,遍历图像的每个像素点,通过与周围8个像素的值进行逻辑与运算,如果周围8个像素中有一个像素为0,则当前像素也设为0,否则设为255。
    • 第一次腐蚀操作应用于二值化后的图像,第二次和第三次腐蚀操作应用于上一次腐蚀处理后的图像。
  3. 函数说明

    • imread(image_path): 用于读取图像文件。
    • cvtColor(image_in, cv2.COLOR_BGR2GRAY): 将彩色图像转换为灰度图像。
    • imshow(image, cmap='gray'): 显示灰度图像。
    • plt.title('title', fontproperties='Microsoft YaHei'): 设置标题的字体为微软雅黑。

通过这些处理,可以清晰地观察到图像经过二值化和腐蚀处理后的效果,以及不同次数腐蚀处理对图像的影响。

从下图可以看到图像白色的部分减少了:

20240420134441868-image

matlab代码实现图像二值化腐蚀源码

以上代码实现了图像的二值化和腐蚀处理。具体功能如下:

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

    • 通过imread函数读取指定路径下的图像文件。
    • 使用rgb2gray函数将读取到的彩色图像转换为灰度图像。
  2. 图像二值化:

    • 将灰度图像中灰度值大于92的像素点设置为255(白色),小于等于92的像素点设置为0(黑色)。
  3. 腐蚀处理:

    • 利用图像的腐蚀操作将目标物体的边界进行腐蚀,消除小的干扰目标和连通区域之间的连接。
    • 采用了多次腐蚀的方式,每次腐蚀都在上一次腐蚀的基础上进行,从而进一步加强腐蚀效果。
  4. 显示图像:

    • 使用subplot函数将原始灰度图像、二值化图像以及三次腐蚀处理后的图像显示在一个窗口中。

函数说明:

  • imread: 用于读取图像文件。
  • rgb2gray: 将彩色图像转换为灰度图像。
  • imshow: 显示图像。
  • subplot: 在一个窗口中显示多个子图像。

从下图可以看到图像白色的部分减少了:

20240420133131811-image

FPGA工程解析

工程层次图

20240420142727894-image

demo18相比,只是多了一个img_erosion_fltr 的模块,同时这个例程中使能了video_tgp_24b模块目的是为了不使用摄像头数据而使用video_tgp_24b生成的条纹数,这样效果更明显,也就是下面这两段代码,在从SDRAM读出来之后,经img_erosion_fltr 处理后再输出hdmi_tx模块。

video_tgp_24b    
#(
    .H_DISP             (12'd1280),
    .V_DISP             (12'd720)
)
u_video_tgp_24b
(
    .clk                (pattern_clk),        
    .rst_n              (sys_rst_n),     
    
    .vaild          (sdram_init_done),
    .DIVIDE_PARAM       (8'd128),
    .data           (pattern_data),    
    .we             (pattern_we)
);
img_erosion_fltr u_img_erosion_fltr_6
(
    .i_clk          (clk_pixel              ),  
    .i_rst_n        (sys_rst_n              ),  
    .i_hs           (erosion_5_hs           ),  
    .i_vs           (erosion_5_vs           ),  
    .i_de           (erosion_5_de           ),  
    .i_bin          (erosion_5_bin          ),  
    .o_hs           (erosion_6_hs           ),  
    .o_vs           (erosion_6_vs           ),  
    .o_de           (erosion_6_de           ),  
    .o_bin          (erosion_6_bin          )   
);

共计例化了img_erosion_fltr 6 次,每处理一次会显示一个画面并延迟一会。

video_tgp_24b模块代码解析

相比之前教程中的video_tgp_24b模块,将图像的测试固定在了img_state <= 2'd1; 这一状态。即图像始终输出为data <= ((lcd_ypos[4]==1'b1) ^ (lcd_xpos[4]==1'b1)) ? {24{1'b0}} : {24{1'b1}}; ,显示为黑白条纹。

img_erosion_fltr模块代码解析

首先例化图像缓冲模块,用于将图像从一个时钟一个像素转为一个时钟输出三行三列9个像素,由于图像是二值图,我们只需随意例化一个通道的buf就可以,我们这里例化R通道。

img_buf u_r_buf
(
	.i_clk	    (i_clk			),
	.i_rst_n    (i_rst_n		),
	.i_de	    (i_de			),
	.i_data	    (i_bin			),
	.o_de	    (				),
	.o_p11		(r_p11			),
	.o_p12		(r_p12			),
	.o_p13		(r_p13			),	
	.o_p21		(r_p21			),
	.o_p22		(r_p22			),
	.o_p23		(r_p23			),		
	.o_p31		(r_p31			),
	.o_p32		(r_p32			),
	.o_p33		(r_p33			)
);

然后就是检查这9个像素是否都为255,

erosion_and <= r_p11 &
		               r_p12 &
		               r_p13 &
		               r_p21 &
		               r_p22 &
		               r_p23 &
		               r_p31 &
		               r_p32 &
		               r_p33;

如果是由结果为255,如果不是则结果为0

if(!i_rst_n) 
	begin
        bin <= 'd0;
    end
    else if(erosion_and)
	begin
		bin <= 'd255;
    end
    else 
	begin
		bin <= 'd0;
    end

管脚约束

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

时序约束

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

实验结果:

这个程序会进行6次腐蚀,每次腐蚀之后会停顿1秒,可以看到图中的白条纹越来越小,黑条纹越来越大,就是白条纹被腐蚀了。

20240409193902113-38ef24747a8f9a4bafedf4ef2c0e9d9

请登录后发表评论

    没有回复内容