[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-17FPGA 实现图像二值化膨胀处理

文档创建者:FPGA课程
浏览次数:3
最后更新:2024-10-21
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 8-FPGA图像入门
本帖最后由 FPGA课程 于 2024-10-21 18:43 编辑

​软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1 图像二值化膨胀算法简介
膨胀操作是形态学图像处理的基础。
膨胀操作是“生长”或“变粗”二值图像中的物体。以 3x3 的滑动模板为例,具体操作是当这九个像素点只要有一 个白色(“1”)时输出白色(“1”),仅当九个像素点全为黑色(“0”)时输出黑色(“0”)。使用逻辑或运算进行操 作,就可以实现膨胀的效果。现在讨论膨胀在数学上的定义,由于 A和 B 是 Z^2 中的集合,A 被 B 膨胀定义为:
94e4737029d948ef98c9fb4e953e7d14.jpg
这个公式是以得到 B 的相对于它自身原点的映像并且由 z 对映像进行位移为基础的。A 被 B 膨胀是所有位移z 的集合,这样,B 和 A 至少有一个元素是重叠的。根据这种解释,式中可以被写为上面的第二个等式。

2 设计分析
2.1Matlab代码分析
源代码如下:
  1. clear;clear all;clc;

  2. image_in = imread('geeker_fpga.jpg'); [row,col,n] = size(image_in);
  3. image_gray    = rgb2gray(image_in);


  4. image_binary=zeros(row,col);
  5. for i=1:row
  6. for j=1:col
  7. if image_gray(i,j) > 92      %转换为二值图像
  8. image_binary(i,j)=255; else
  9. image_binary(i,j)=0;
  10. end end
  11. end

  12. image_dilate_0=zeros(row,col); for i = 2:1:row-1
  13. for j = 2:1:col-1
  14. image_dilate_0(i,j) =...
  15. image_binary(i-1,j-1)|image_binary(i-1,j)|image_binary(i-1,j+1)|...   image_binary(i,j-1)    |image_binary(i,j)    |image_binary(i,j+1)     |... image_binary(i+1,j-1)|image_binary(i+1,j)|image_binary(i+1,j+1);
  16. end end
  17. image_dilate_1=zeros(row,col); for i = 2:1:row-1
  18. for j = 2:1:col-1
  19. image_dilate_1(i,j) =...
  20. image_dilate_0(i-1,j-1)|image_dilate_0(i-1,j)|image_dilate_0(i-1,j+1)|...   image_dilate_0(i,j-1)    |image_dilate_0(i,j)    |image_dilate_0(i,j+1)     |... image_dilate_0(i+1,j-1)|image_dilate_0(i+1,j)|image_dilate_0(i+1,j+1);
  21. end end
  22. image_dilate_2=zeros(row,col); for i = 2:1:row-1
  23. for j = 2:1:col-1
  24. image_dilate_2(i,j) =...
  25. image_dilate_1(i-1,j-1)|image_dilate_ 1(i-1,j)|image_dilate_ 1(i-1,j+1)|...   image_dilate_1(i,j-1)    |image_dilate_ 1(i,j)    |image_dilate_1(i,j+1)     |... image_dilate_1(i+1,j-1)|image_dilate_ 1(i+1,j)|image_dilate_ 1(i+1,j+1);
  26. end end

  27. subplot(321);
  28. imshow(image_gray); title('the image gray image'); subplot(322);
  29. imshow(image_binary); title('the image binary image'); subplot(323);
  30. imshow(image_dilate_0); title('the image dilate 0 image'); subplot(324);
  31. imshow(image_dilate_ 1); title('the image dilate 1 image'); subplot(325);
  32. imshow(image_dilate_2); title('the image dilate 2 image');
复制代码

2.2Verilog代码分析
  1. always@(posedge i_clk ornegedge i_rst_n) begin
  2. if(!i_rst_n) begin
  3. dilate_or <= 'd0;
  4. end
  5. else
  6. begin
  7. dilate_or <= r_temp_ 11[0] ||
  8. r_temp_ 12[0] || r_temp_ 13[0] || r_temp_21[0] || r_temp_22[0] || r_temp_23[0] || r_temp_31[0] || r_temp_32[0] || r_temp_33[0] ;
  9. end end

  10. always@(posedge i_clk ornegedge i_rst_n) begin
  11. if(!i_rst_n) begin
  12. binary_reg <= 'd0; end
  13. else if(dilate_or) begin
  14. binary_reg <= 'd255;
  15. end
  16. else
  17. begin
  18. binary_reg <= 'd0;
  19. end end
复制代码

2.3 工程结构分析

我们将图像算法的模块做成 IP 后,在vivado 中进行工程的搭建,工程结构如图所示:
036ed4f7138c43e5900b0b7d5aadcb98.jpg
3 仿真及结果
3.1Matlab实验结果

我们对实验图像进行了二值化操作,然后进行了三次膨胀操作,每次的结果显示在图中,我们可以看到膨胀的次数 越多,白色线条变的越来越粗。
ba7a84acebed4370b9d21bede0216a1b.jpg
3.2Modelsim实验结果

bd62f8dfcf504802af10ceae783b90fe.jpg
4 搭建 Vitis-sdk 工程
创建 soc_base  sdk  platform  和 APP  工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。
4.1 创建 SDKPlatform工程
80020740cee44cb4ad5aa4266ab27b7e.jpg

4.2SDKAPP工程

e5c3a5c74089441cbd09ac61761487bb.jpg

5 硬件连接
硬件连接如图所示:
d8cf640081bd4611aea87eaac99b5cd5.jpg
6 上板实验结果
实验结果如图所示:

55a86df899b04ef7b72dfbe1b4487650.jpg
4819ae70cbd7415192a60cd4ba6fe07f.jpg




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则