手机扫码
链接直达
https://item.taobao.com/item.htm?ft=t&id=776516984361
图像二值化腐蚀处理有什么作用?
图像二值化腐蚀处理在图像处理中起到了以下作用:
-
物体分割与提取:在图像二值化之后,通过腐蚀操作可以消除噪声、连接相邻的物体,并使得物体的边界更加清晰,从而更容易对物体进行分割和提取。
-
图像细化:对于二值图像中的细长对象或者凹陷部分,腐蚀操作可以使得这些部分变得更加细长,达到细化的效果,有助于后续的图像分析和处理。
-
图像形态学处理:腐蚀操作是形态学图像处理中的基本操作之一,通过腐蚀可以改变图像的形状和结构,使得后续的处理更加精确和准确。
-
图像预处理:在图像处理的预处理阶段,二值化腐蚀处理可以使得图像更加规范化和标准化,为后续的特征提取、目标检测等操作提供更好的图像基础。
总的来说,图像二值化腐蚀处理可以提高图像的质量,增强图像的特征,从而更好地适应各种图像处理和分析任务的需求。
图像二值化腐蚀的算法和步骤
图像二值化腐蚀是图像处理中常用的一种形态学操作,其算法和步骤如下:
-
二值化:首先将输入的灰度图像进行二值化处理,将图像转换为黑白二值图像。二值化操作可以根据阈值将图像中的像素分为两类,一类是大于阈值的像素(前景),另一类是小于等于阈值的像素(背景)。
-
结构元素:定义一个结构元素,通常是一个小的二值化图像,用来表示腐蚀的形状和大小。结构元素可以是任意形状,常见的包括矩形、圆形、十字形等。
-
腐蚀操作:对二值化后的图像进行腐蚀操作。腐蚀操作的原理是用结构元素在图像上滑动,如果结构元素完全覆盖了前景区域(像素值为1),则中心像素的值保持为1;否则,中心像素的值被置为0。这样可以使得前景区域逐渐收缩,边界变得更加平滑,孔洞变得更小。
-
重复操作:根据具体的需求,可以多次进行腐蚀操作,以进一步缩小前景区域的大小或填充小的孔洞。每次腐蚀操作都会使前景区域缩小,直到达到预期的效果为止。
-
输出结果:腐蚀操作结束后,得到经过二值化腐蚀处理的图像,可以用于后续的图像分析、特征提取或目标检测等任务。
总的来说,图像二值化腐蚀的算法步骤简单清晰,通过不断缩小前景区域的像素来实现对图像的处理和特征增强。
我们下需展示的源码是使用的结构元素实为3*3的模板,具体操作是当这九个像素点全为白色(“1”) 时输出白色(“1”), 否则输出黑色(“0”)。 优化成逻辑,就是使用逻辑与运算对这9个像素进行位与操作。
python代码实现图像二值化腐蚀源码
这段代码实现了图像的二值化和腐蚀处理,并通过Matplotlib库将处理后的图像显示出来。
-
图像二值化处理:
- 通过循环遍历图像的每个像素,判断其灰度值是否大于阈值92,若大于则将像素值设为255(白色),否则设为0(黑色),从而将图像转换为二值图像。
-
腐蚀处理:
- 分别对二值化后的图像进行了三次腐蚀处理,每次腐蚀操作都是基于逻辑运算的操作。
- 在腐蚀操作中,遍历图像的每个像素点,通过与周围8个像素的值进行逻辑与运算,如果周围8个像素中有一个像素为0,则当前像素也设为0,否则设为255。
- 第一次腐蚀操作应用于二值化后的图像,第二次和第三次腐蚀操作应用于上一次腐蚀处理后的图像。
-
函数说明:
imread(image_path)
: 用于读取图像文件。cvtColor(image_in, cv2.COLOR_BGR2GRAY)
: 将彩色图像转换为灰度图像。imshow(image, cmap='gray')
: 显示灰度图像。plt.title('title', fontproperties='Microsoft YaHei')
: 设置标题的字体为微软雅黑。
通过这些处理,可以清晰地观察到图像经过二值化和腐蚀处理后的效果,以及不同次数腐蚀处理对图像的影响。
从下图可以看到图像白色的部分减少了:
matlab代码实现图像二值化腐蚀源码
以上代码实现了图像的二值化和腐蚀处理。具体功能如下:
-
读取图像并转换为灰度图像:
- 通过
imread
函数读取指定路径下的图像文件。 - 使用
rgb2gray
函数将读取到的彩色图像转换为灰度图像。
- 通过
-
图像二值化:
- 将灰度图像中灰度值大于92的像素点设置为255(白色),小于等于92的像素点设置为0(黑色)。
-
腐蚀处理:
- 利用图像的腐蚀操作将目标物体的边界进行腐蚀,消除小的干扰目标和连通区域之间的连接。
- 采用了多次腐蚀的方式,每次腐蚀都在上一次腐蚀的基础上进行,从而进一步加强腐蚀效果。
-
显示图像:
- 使用
subplot
函数将原始灰度图像、二值化图像以及三次腐蚀处理后的图像显示在一个窗口中。
- 使用
函数说明:
imread
: 用于读取图像文件。rgb2gray
: 将彩色图像转换为灰度图像。imshow
: 显示图像。subplot
: 在一个窗口中显示多个子图像。
从下图可以看到图像白色的部分减少了:
FPGA工程解析
工程层次图
与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秒,可以看到图中的白条纹越来越小,黑条纹越来越大,就是白条纹被腐蚀了。
没有回复内容