[X]关闭

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

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

​ 软件版本: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 图像 OTSU 算法简介
Otsu(大津法)算法是由日本学者 OTSU 于 1979 年提出的一种对图像进行二值化的高效算法。原理上来讲, 该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最 大,是二值化的最佳全局阈值的算法。
为了说明大津法的计算过程,先来说明二值化的数学计算过程,假设一幅灰度图像用f (x, y) 表示,其二值化 的全局阈值使用 T 表示,二值化后的图像使用g(x, y) 表示,那么可以使用下公式表示:
image.jpg
大津法可以得到最佳的全局阈值 T,计算过程如下: 假设一幅图像的直方图用公式表示如下,
image.jpg
q = 0,1, 2..., L−1
其中,n 是像素总数,nq是灰度级为 q 的像素数量,L 是图像的灰度级。
灰度级小于 T 的像素集合,C2 是一组灰度级大于 T 的像素集合。选择最佳阈值 t,最大类方差σB(2)(t) 定义为:
σB(2)(t) = P1 (t)[m1 (t) − mG]2  + P2 (t)[m2 (t) − mG]2 这里,P1 (t) 是集合 C1 发生的概率:
image.jpg
比如,如果设置 t=0,那么拥有为 t 赋值的任何像素 C1 集合的概率为 0,类似的,集合 C2 的发生概率为
image.jpg
m1 (t) 和m2 (t) 分别是集合 C1 和 C2 中像素的平均灰度。mG是全局像素均值:

image.jpg
另外,直到灰度级 t 的平均灰度由公式给出:
image.jpg
展开σB(2)(t) 的表达式后,根据 d1e81e6bc695497b9c3a1275570179dd.jpg 可以推导出类间方差如下公式:
image.jpg
这个最终的公式计算十分有效,对于所有的阈值 t 来说,只需要参数 m 和P1 计算一次即可。
大津法的想法是,方差越大,就离完全分割图像的阈值更接近。注意,这个最佳阈值依赖于参数,可以直接从直方图中得到。另外, t 是出于 0 到 L-1 的所以整数,寻找最大方差,需要遍历所有的 t 值。
2 设计分析
2.1Matlab代码分析
源代码如下:
  1. clear;clear all;clc;
  2. image_in = imread('lena_1280x720.jpg'); [row,col,n] = size(image_in);
  3. image_gray=rgb2gray(image_in);
  4. threshold = graythresh(image_gray); %graythresh 函数是输入一副图像,获取图像合适的阈值

  5. image_ostu1=im2bw(image_gray,threshold); %转换为二值图像 threshold = threshold *255;
  6. subplot(311);
  7. imshow(image_gray); title('the image gray image'); subplot(312);
  8. imshow(image_ostu1); title('the image ostu1 image');

  9. N=row*col; L=256;
  10. for i=1:L
  11. count(i)=length(find(image_gray==(i-1))); p(i)=count(i)/(row*col);
  12. pp(i)=count(i); end
  13. m_g=0;
  14. for i=1:L
  15. m_g=m_g+p(i)*(i-1); m(i)=m_g;
  16. end

  17. for i=1:L
  18. p_k(i)=sum(p(1:i));
  19. end

  20. k=(m_g*p_k-m).^2./(p_k.*(1-p_k));




  21. m_g1=0;
  22. for i=1:L
  23. m_g1=m_g1+pp(i)*(i-1); m1(i)=m_g1;
  24. end

  25. for i=1:L
  26. pp_k(i)=sum(pp(1:i));
  27. end
  28. kk=((fix(m_g1/(row*col)))*(fix(pp_k/4096))-(fix(m1/4096))).^2./((fix(pp_k/4096)).*(225-(fix(pp_k/4096)))); %向零方向取整
  29. t=(m_g1/(row*col))*(pp_k/4096)-(m1/4096); t1=225-pp_k/4096;
  30. t2=(pp_k/4096).*(225-pp_k/4096); t3=(m1/4096);
  31. t4=(pp_k/4096);

  32. kkk=((m_g1/(row*col))*(pp_k/(row*col))-(m1/(row*col))).^2./((pp_k/(row*col)).*(1-pp_k/(row*col)));

  33. [y1,th1]=max(kk);   [y2,th2]=max(kkk);

  34. [y,th]=max(k);

  35. for i=1:row
  36. for j=1:col
  37. if image_gray(i,j)>th      %阈值判定
  38. image_ostu2(i,j)=255; else
  39. image_ostu2(i,j)=0; end
  40. end end

  41. subplot(313);
  42. imshow(image_ostu2);    title('the image ostu2 image');
复制代码

2.2Verilog代码分析
  1. always@(posedge i_clk )
  2. begin
  3.         i_vsyn_d <=        i_vsyn;
  4. end

  5. always@(posedge i_clk )
  6. begin
  7.         if(!i_rst_n)
  8.                 ap_clk <= 0;
  9.         else
  10.                 ap_clk <= ~ap_clk;
  11. end


  12. //***************************************************
  13. //histogram
  14. //***************************************************
  15. always@(posedge i_clk )
  16. begin
  17.         if(i_vsyn && !i_vsyn_d)
  18.         begin
  19.                 hist_ram[0  ]<= 'd0;
  20.         hist_ram[1  ]<= 'd0;
  21.         hist_ram[2  ]<= 'd0;
  22.         hist_ram[3  ]<= 'd0;
  23.         hist_ram[4  ]<= 'd0;
  24.         hist_ram[5  ]<= 'd0;
  25.         hist_ram[6  ]<= 'd0;
  26.         hist_ram[7  ]<= 'd0;
  27.         hist_ram[8  ]<= 'd0;
  28.         hist_ram[9  ]<= 'd0;
  29.         hist_ram[10 ]<= 'd0;
  30.         hist_ram[11 ]<= 'd0;
  31.         hist_ram[12 ]<= 'd0;
  32.         hist_ram[13 ]<= 'd0;
  33.         hist_ram[14 ]<= 'd0;
  34.         hist_ram[15 ]<= 'd0;
  35.         hist_ram[16 ]<= 'd0;
  36.         hist_ram[17 ]<= 'd0;
  37.         hist_ram[18 ]<= 'd0;
  38.         hist_ram[19 ]<= 'd0;
  39.         hist_ram[20 ]<= 'd0;
  40.         hist_ram[21 ]<= 'd0;
  41.         hist_ram[22 ]<= 'd0;
  42.         hist_ram[23 ]<= 'd0;
  43.         hist_ram[24 ]<= 'd0;
  44.         hist_ram[25 ]<= 'd0;
  45.         hist_ram[26 ]<= 'd0;
  46.         hist_ram[27 ]<= 'd0;
  47.         hist_ram[28 ]<= 'd0;
  48.         hist_ram[29 ]<= 'd0;
  49.         hist_ram[30 ]<= 'd0;
  50.         hist_ram[31 ]<= 'd0;
  51.         hist_ram[32 ]<= 'd0;
  52.         hist_ram[33 ]<= 'd0;
  53.         hist_ram[34 ]<= 'd0;
  54.         hist_ram[35 ]<= 'd0;
  55.         hist_ram[36 ]<= 'd0;
  56.         hist_ram[37 ]<= 'd0;
  57.         hist_ram[38 ]<= 'd0;
  58.         hist_ram[39 ]<= 'd0;
  59.         hist_ram[40 ]<= 'd0;
  60.         hist_ram[41 ]<= 'd0;
  61.         hist_ram[42 ]<= 'd0;
  62.         hist_ram[43 ]<= 'd0;
  63.         hist_ram[44 ]<= 'd0;
  64.         hist_ram[45 ]<= 'd0;
  65.         hist_ram[46 ]<= 'd0;
  66.         hist_ram[47 ]<= 'd0;
  67.         hist_ram[48 ]<= 'd0;
  68.         hist_ram[49 ]<= 'd0;
  69.         hist_ram[50 ]<= 'd0;
  70.         hist_ram[51 ]<= 'd0;
  71.         hist_ram[52 ]<= 'd0;
  72.         hist_ram[53 ]<= 'd0;
  73.         hist_ram[54 ]<= 'd0;
  74.         hist_ram[55 ]<= 'd0;
  75.         hist_ram[56 ]<= 'd0;
  76.         hist_ram[57 ]<= 'd0;
  77.         hist_ram[58 ]<= 'd0;
  78.         hist_ram[59 ]<= 'd0;
  79.         hist_ram[60 ]<= 'd0;
  80.         hist_ram[61 ]<= 'd0;
  81.         hist_ram[62 ]<= 'd0;
  82.         hist_ram[63 ]<= 'd0;
  83.         hist_ram[64 ]<= 'd0;
  84.         hist_ram[65 ]<= 'd0;
  85.         hist_ram[66 ]<= 'd0;
  86.         hist_ram[67 ]<= 'd0;
  87.         hist_ram[68 ]<= 'd0;
  88.         hist_ram[69 ]<= 'd0;
  89.         hist_ram[70 ]<= 'd0;
  90.         hist_ram[71 ]<= 'd0;
  91.         hist_ram[72 ]<= 'd0;
  92.         hist_ram[73 ]<= 'd0;
  93.         hist_ram[74 ]<= 'd0;
  94.         hist_ram[75 ]<= 'd0;
  95.         hist_ram[76 ]<= 'd0;
  96.         hist_ram[77 ]<= 'd0;
  97.         hist_ram[78 ]<= 'd0;
  98.         hist_ram[79 ]<= 'd0;
  99.         hist_ram[80 ]<= 'd0;
  100.         hist_ram[81 ]<= 'd0;
  101.         hist_ram[82 ]<= 'd0;
  102.         hist_ram[83 ]<= 'd0;
  103.         hist_ram[84 ]<= 'd0;
  104.         hist_ram[85 ]<= 'd0;
  105.         hist_ram[86 ]<= 'd0;
  106.         hist_ram[87 ]<= 'd0;
  107.         hist_ram[88 ]<= 'd0;
  108.         hist_ram[89 ]<= 'd0;
  109.         hist_ram[90 ]<= 'd0;
  110.         hist_ram[91 ]<= 'd0;
  111.         hist_ram[92 ]<= 'd0;
  112.         hist_ram[93 ]<= 'd0;
  113.         hist_ram[94 ]<= 'd0;
  114.         hist_ram[95 ]<= 'd0;
  115.         hist_ram[96 ]<= 'd0;
  116.         hist_ram[97 ]<= 'd0;
  117.         hist_ram[98 ]<= 'd0;
  118.         hist_ram[99 ]<= 'd0;
  119.         hist_ram[100]<= 'd0;
  120.         hist_ram[101]<= 'd0;
  121.         hist_ram[102]<= 'd0;
  122.         hist_ram[103]<= 'd0;
  123.         hist_ram[104]<= 'd0;
  124.         hist_ram[105]<= 'd0;
  125.         hist_ram[106]<= 'd0;
  126.         hist_ram[107]<= 'd0;
  127.         hist_ram[108]<= 'd0;
  128.         hist_ram[109]<= 'd0;
  129.         hist_ram[110]<= 'd0;
  130.         hist_ram[111]<= 'd0;
  131.         hist_ram[112]<= 'd0;
  132.         hist_ram[113]<= 'd0;
  133.         hist_ram[114]<= 'd0;
  134.         hist_ram[115]<= 'd0;
  135.         hist_ram[116]<= 'd0;
  136.         hist_ram[117]<= 'd0;
  137.         hist_ram[118]<= 'd0;
  138.         hist_ram[119]<= 'd0;
  139.         hist_ram[120]<= 'd0;
  140.         hist_ram[121]<= 'd0;
  141.         hist_ram[122]<= 'd0;
  142.         hist_ram[123]<= 'd0;
  143.         hist_ram[124]<= 'd0;
  144.         hist_ram[125]<= 'd0;
  145.         hist_ram[126]<= 'd0;
  146.         hist_ram[127]<= 'd0;
  147.         hist_ram[128]<= 'd0;
  148.         hist_ram[129]<= 'd0;
  149.         hist_ram[130]<= 'd0;
  150.         hist_ram[131]<= 'd0;
  151.         hist_ram[132]<= 'd0;
  152.         hist_ram[133]<= 'd0;
  153.         hist_ram[134]<= 'd0;
  154.         hist_ram[135]<= 'd0;
  155.         hist_ram[136]<= 'd0;
  156.         hist_ram[137]<= 'd0;
  157.         hist_ram[138]<= 'd0;
  158.         hist_ram[139]<= 'd0;
  159.         hist_ram[140]<= 'd0;
  160.         hist_ram[141]<= 'd0;
  161.         hist_ram[142]<= 'd0;
  162.         hist_ram[143]<= 'd0;
  163.         hist_ram[144]<= 'd0;
  164.         hist_ram[145]<= 'd0;
  165.         hist_ram[146]<= 'd0;
  166.         hist_ram[147]<= 'd0;
  167.         hist_ram[148]<= 'd0;
  168.         hist_ram[149]<= 'd0;
  169.         hist_ram[150]<= 'd0;
  170.         hist_ram[151]<= 'd0;
  171.         hist_ram[152]<= 'd0;
  172.         hist_ram[153]<= 'd0;
  173.         hist_ram[154]<= 'd0;
  174.         hist_ram[155]<= 'd0;
  175.         hist_ram[156]<= 'd0;
  176.         hist_ram[157]<= 'd0;
  177.         hist_ram[158]<= 'd0;
  178.         hist_ram[159]<= 'd0;
  179.         hist_ram[160]<= 'd0;
  180.         hist_ram[161]<= 'd0;
  181.         hist_ram[162]<= 'd0;
  182.         hist_ram[163]<= 'd0;
  183.         hist_ram[164]<= 'd0;
  184.         hist_ram[165]<= 'd0;
  185.         hist_ram[166]<= 'd0;
  186.         hist_ram[167]<= 'd0;
  187.         hist_ram[168]<= 'd0;
  188.         hist_ram[169]<= 'd0;
  189.         hist_ram[170]<= 'd0;
  190.         hist_ram[171]<= 'd0;
  191.         hist_ram[172]<= 'd0;
  192.         hist_ram[173]<= 'd0;
  193.         hist_ram[174]<= 'd0;
  194.         hist_ram[175]<= 'd0;
  195.         hist_ram[176]<= 'd0;
  196.         hist_ram[177]<= 'd0;
  197.         hist_ram[178]<= 'd0;
  198.         hist_ram[179]<= 'd0;
  199.         hist_ram[180]<= 'd0;
  200.         hist_ram[181]<= 'd0;
  201.         hist_ram[182]<= 'd0;
  202.         hist_ram[183]<= 'd0;
  203.         hist_ram[184]<= 'd0;
  204.         hist_ram[185]<= 'd0;
  205.         hist_ram[186]<= 'd0;
  206.         hist_ram[187]<= 'd0;
  207.         hist_ram[188]<= 'd0;
  208.         hist_ram[189]<= 'd0;
  209.         hist_ram[190]<= 'd0;
  210.         hist_ram[191]<= 'd0;
  211.         hist_ram[192]<= 'd0;
  212.         hist_ram[193]<= 'd0;
  213.         hist_ram[194]<= 'd0;
  214.         hist_ram[195]<= 'd0;
  215.         hist_ram[196]<= 'd0;
  216.         hist_ram[197]<= 'd0;
  217.         hist_ram[198]<= 'd0;
  218.         hist_ram[199]<= 'd0;
  219.         hist_ram[200]<= 'd0;
  220.         hist_ram[201]<= 'd0;
  221.         hist_ram[202]<= 'd0;
  222.         hist_ram[203]<= 'd0;
  223.         hist_ram[204]<= 'd0;
  224.         hist_ram[205]<= 'd0;
  225.         hist_ram[206]<= 'd0;
  226.         hist_ram[207]<= 'd0;
  227.         hist_ram[208]<= 'd0;
  228.         hist_ram[209]<= 'd0;
  229.         hist_ram[210]<= 'd0;
  230.         hist_ram[211]<= 'd0;
  231.         hist_ram[212]<= 'd0;
  232.         hist_ram[213]<= 'd0;
  233.         hist_ram[214]<= 'd0;
  234.         hist_ram[215]<= 'd0;
  235.         hist_ram[216]<= 'd0;
  236.         hist_ram[217]<= 'd0;
  237.         hist_ram[218]<= 'd0;
  238.         hist_ram[219]<= 'd0;
  239.         hist_ram[220]<= 'd0;
  240.         hist_ram[221]<= 'd0;
  241.         hist_ram[222]<= 'd0;
  242.         hist_ram[223]<= 'd0;
  243.         hist_ram[224]<= 'd0;
  244.         hist_ram[225]<= 'd0;
  245.         hist_ram[226]<= 'd0;
  246.         hist_ram[227]<= 'd0;
  247.         hist_ram[228]<= 'd0;
  248.         hist_ram[229]<= 'd0;
  249.         hist_ram[230]<= 'd0;
  250.         hist_ram[231]<= 'd0;
  251.         hist_ram[232]<= 'd0;
  252.         hist_ram[233]<= 'd0;
  253.         hist_ram[234]<= 'd0;
  254.         hist_ram[235]<= 'd0;
  255.         hist_ram[236]<= 'd0;
  256.         hist_ram[237]<= 'd0;
  257.         hist_ram[238]<= 'd0;
  258.         hist_ram[239]<= 'd0;
  259.         hist_ram[240]<= 'd0;
  260.         hist_ram[241]<= 'd0;
  261.         hist_ram[242]<= 'd0;
  262.         hist_ram[243]<= 'd0;
  263.         hist_ram[244]<= 'd0;
  264.         hist_ram[245]<= 'd0;
  265.         hist_ram[246]<= 'd0;
  266.         hist_ram[247]<= 'd0;
  267.         hist_ram[248]<= 'd0;
  268.         hist_ram[249]<= 'd0;
  269.         hist_ram[250]<= 'd0;
  270.         hist_ram[251]<= 'd0;
  271.         hist_ram[252]<= 'd0;
  272.         hist_ram[253]<= 'd0;
  273.         hist_ram[254]<= 'd0;
  274.         hist_ram[255]<= 'd0;
  275.         end
  276.         else if(i_en && i_vsyn)
  277.         begin               
  278.                 case(i_gray)
  279.                 0  :hist_ram[0  ]<=hist_ram[0  ]+1'b1;
  280.                 1  :hist_ram[1  ]<=hist_ram[1  ]+1'b1;
  281.                 2  :hist_ram[2  ]<=hist_ram[2  ]+1'b1;
  282.                 3  :hist_ram[3  ]<=hist_ram[3  ]+1'b1;
  283.                 4  :hist_ram[4  ]<=hist_ram[4  ]+1'b1;
  284.                 5  :hist_ram[5  ]<=hist_ram[5  ]+1'b1;
  285.                 6  :hist_ram[6  ]<=hist_ram[6  ]+1'b1;
  286.                 7  :hist_ram[7  ]<=hist_ram[7  ]+1'b1;
  287.                 8  :hist_ram[8  ]<=hist_ram[8  ]+1'b1;
  288.                 9  :hist_ram[9  ]<=hist_ram[9  ]+1'b1;
  289.                 10 :hist_ram[10 ]<=hist_ram[10 ]+1'b1;
  290.                 11 :hist_ram[11 ]<=hist_ram[11 ]+1'b1;
  291.                 12 :hist_ram[12 ]<=hist_ram[12 ]+1'b1;
  292.                 13 :hist_ram[13 ]<=hist_ram[13 ]+1'b1;
  293.                 14 :hist_ram[14 ]<=hist_ram[14 ]+1'b1;
  294.                 15 :hist_ram[15 ]<=hist_ram[15 ]+1'b1;
  295.                 16 :hist_ram[16 ]<=hist_ram[16 ]+1'b1;
  296.                 17 :hist_ram[17 ]<=hist_ram[17 ]+1'b1;
  297.                 18 :hist_ram[18 ]<=hist_ram[18 ]+1'b1;
  298.                 19 :hist_ram[19 ]<=hist_ram[19 ]+1'b1;
  299.                 20 :hist_ram[20 ]<=hist_ram[20 ]+1'b1;
  300.                 21 :hist_ram[21 ]<=hist_ram[21 ]+1'b1;
  301.                 22 :hist_ram[22 ]<=hist_ram[22 ]+1'b1;
  302.                 23 :hist_ram[23 ]<=hist_ram[23 ]+1'b1;
  303.                 24 :hist_ram[24 ]<=hist_ram[24 ]+1'b1;
  304.                 25 :hist_ram[25 ]<=hist_ram[25 ]+1'b1;
  305.                 26 :hist_ram[26 ]<=hist_ram[26 ]+1'b1;
  306.                 27 :hist_ram[27 ]<=hist_ram[27 ]+1'b1;
  307.                 28 :hist_ram[28 ]<=hist_ram[28 ]+1'b1;
  308.                 29 :hist_ram[29 ]<=hist_ram[29 ]+1'b1;
  309.                 30 :hist_ram[30 ]<=hist_ram[30 ]+1'b1;
  310.                 31 :hist_ram[31 ]<=hist_ram[31 ]+1'b1;
  311.                 32 :hist_ram[32 ]<=hist_ram[32 ]+1'b1;
  312.                 33 :hist_ram[33 ]<=hist_ram[33 ]+1'b1;
  313.                 34 :hist_ram[34 ]<=hist_ram[34 ]+1'b1;
  314.                 35 :hist_ram[35 ]<=hist_ram[35 ]+1'b1;
  315.                 36 :hist_ram[36 ]<=hist_ram[36 ]+1'b1;
  316.                 37 :hist_ram[37 ]<=hist_ram[37 ]+1'b1;
  317.                 38 :hist_ram[38 ]<=hist_ram[38 ]+1'b1;
  318.                 39 :hist_ram[39 ]<=hist_ram[39 ]+1'b1;
  319.                 40 :hist_ram[40 ]<=hist_ram[40 ]+1'b1;
  320.                 41 :hist_ram[41 ]<=hist_ram[41 ]+1'b1;
  321.                 42 :hist_ram[42 ]<=hist_ram[42 ]+1'b1;
  322.                 43 :hist_ram[43 ]<=hist_ram[43 ]+1'b1;
  323.                 44 :hist_ram[44 ]<=hist_ram[44 ]+1'b1;
  324.                 45 :hist_ram[45 ]<=hist_ram[45 ]+1'b1;
  325.                 46 :hist_ram[46 ]<=hist_ram[46 ]+1'b1;
  326.                 47 :hist_ram[47 ]<=hist_ram[47 ]+1'b1;
  327.                 48 :hist_ram[48 ]<=hist_ram[48 ]+1'b1;
  328.                 49 :hist_ram[49 ]<=hist_ram[49 ]+1'b1;
  329.                 50 :hist_ram[50 ]<=hist_ram[50 ]+1'b1;
  330.                 51 :hist_ram[51 ]<=hist_ram[51 ]+1'b1;
  331.                 52 :hist_ram[52 ]<=hist_ram[52 ]+1'b1;
  332.                 53 :hist_ram[53 ]<=hist_ram[53 ]+1'b1;
  333.                 54 :hist_ram[54 ]<=hist_ram[54 ]+1'b1;
  334.                 55 :hist_ram[55 ]<=hist_ram[55 ]+1'b1;
  335.                 56 :hist_ram[56 ]<=hist_ram[56 ]+1'b1;
  336.                 57 :hist_ram[57 ]<=hist_ram[57 ]+1'b1;
  337.                 58 :hist_ram[58 ]<=hist_ram[58 ]+1'b1;
  338.                 59 :hist_ram[59 ]<=hist_ram[59 ]+1'b1;
  339.                 60 :hist_ram[60 ]<=hist_ram[60 ]+1'b1;
  340.                 61 :hist_ram[61 ]<=hist_ram[61 ]+1'b1;
  341.                 62 :hist_ram[62 ]<=hist_ram[62 ]+1'b1;
  342.                 63 :hist_ram[63 ]<=hist_ram[63 ]+1'b1;
  343.                 64 :hist_ram[64 ]<=hist_ram[64 ]+1'b1;
  344.                 65 :hist_ram[65 ]<=hist_ram[65 ]+1'b1;
  345.                 66 :hist_ram[66 ]<=hist_ram[66 ]+1'b1;
  346.                 67 :hist_ram[67 ]<=hist_ram[67 ]+1'b1;
  347.                 68 :hist_ram[68 ]<=hist_ram[68 ]+1'b1;
  348.                 69 :hist_ram[69 ]<=hist_ram[69 ]+1'b1;
  349.                 70 :hist_ram[70 ]<=hist_ram[70 ]+1'b1;
  350.                 71 :hist_ram[71 ]<=hist_ram[71 ]+1'b1;
  351.                 72 :hist_ram[72 ]<=hist_ram[72 ]+1'b1;
  352.                 73 :hist_ram[73 ]<=hist_ram[73 ]+1'b1;
  353.                 74 :hist_ram[74 ]<=hist_ram[74 ]+1'b1;
  354.                 75 :hist_ram[75 ]<=hist_ram[75 ]+1'b1;
  355.                 76 :hist_ram[76 ]<=hist_ram[76 ]+1'b1;
  356.                 77 :hist_ram[77 ]<=hist_ram[77 ]+1'b1;
  357.                 78 :hist_ram[78 ]<=hist_ram[78 ]+1'b1;
  358.                 79 :hist_ram[79 ]<=hist_ram[79 ]+1'b1;
  359.                 80 :hist_ram[80 ]<=hist_ram[80 ]+1'b1;
  360.                 81 :hist_ram[81 ]<=hist_ram[81 ]+1'b1;
  361.                 82 :hist_ram[82 ]<=hist_ram[82 ]+1'b1;
  362.                 83 :hist_ram[83 ]<=hist_ram[83 ]+1'b1;
  363.                 84 :hist_ram[84 ]<=hist_ram[84 ]+1'b1;
  364.                 85 :hist_ram[85 ]<=hist_ram[85 ]+1'b1;
  365.                 86 :hist_ram[86 ]<=hist_ram[86 ]+1'b1;
  366.                 87 :hist_ram[87 ]<=hist_ram[87 ]+1'b1;
  367.                 88 :hist_ram[88 ]<=hist_ram[88 ]+1'b1;
  368.                 89 :hist_ram[89 ]<=hist_ram[89 ]+1'b1;
  369.                 90 :hist_ram[90 ]<=hist_ram[90 ]+1'b1;
  370.                 91 :hist_ram[91 ]<=hist_ram[91 ]+1'b1;
  371.                 92 :hist_ram[92 ]<=hist_ram[92 ]+1'b1;
  372.                 93 :hist_ram[93 ]<=hist_ram[93 ]+1'b1;
  373.                 94 :hist_ram[94 ]<=hist_ram[94 ]+1'b1;
  374.                 95 :hist_ram[95 ]<=hist_ram[95 ]+1'b1;
  375.                 96 :hist_ram[96 ]<=hist_ram[96 ]+1'b1;
  376.                 97 :hist_ram[97 ]<=hist_ram[97 ]+1'b1;
  377.                 98 :hist_ram[98 ]<=hist_ram[98 ]+1'b1;
  378.                 99 :hist_ram[99 ]<=hist_ram[99 ]+1'b1;
  379.                 100:hist_ram[100]<=hist_ram[100]+1'b1;
  380.                 101:hist_ram[101]<=hist_ram[101]+1'b1;
  381.                 102:hist_ram[102]<=hist_ram[102]+1'b1;
  382.                 103:hist_ram[103]<=hist_ram[103]+1'b1;
  383.                 104:hist_ram[104]<=hist_ram[104]+1'b1;
  384.                 105:hist_ram[105]<=hist_ram[105]+1'b1;
  385.                 106:hist_ram[106]<=hist_ram[106]+1'b1;
  386.                 107:hist_ram[107]<=hist_ram[107]+1'b1;
  387.                 108:hist_ram[108]<=hist_ram[108]+1'b1;
  388.                 109:hist_ram[109]<=hist_ram[109]+1'b1;
  389.                 110:hist_ram[110]<=hist_ram[110]+1'b1;
  390.                 111:hist_ram[111]<=hist_ram[111]+1'b1;
  391.                 112:hist_ram[112]<=hist_ram[112]+1'b1;
  392.                 113:hist_ram[113]<=hist_ram[113]+1'b1;
  393.                 114:hist_ram[114]<=hist_ram[114]+1'b1;
  394.                 115:hist_ram[115]<=hist_ram[115]+1'b1;
  395.                 116:hist_ram[116]<=hist_ram[116]+1'b1;
  396.                 117:hist_ram[117]<=hist_ram[117]+1'b1;
  397.                 118:hist_ram[118]<=hist_ram[118]+1'b1;
  398.                 119:hist_ram[119]<=hist_ram[119]+1'b1;
  399.                 120:hist_ram[120]<=hist_ram[120]+1'b1;
  400.                 121:hist_ram[121]<=hist_ram[121]+1'b1;
  401.                 122:hist_ram[122]<=hist_ram[122]+1'b1;
  402.                 123:hist_ram[123]<=hist_ram[123]+1'b1;
  403.                 124:hist_ram[124]<=hist_ram[124]+1'b1;
  404.                 125:hist_ram[125]<=hist_ram[125]+1'b1;
  405.                 126:hist_ram[126]<=hist_ram[126]+1'b1;
  406.                 127:hist_ram[127]<=hist_ram[127]+1'b1;
  407.                 128:hist_ram[128]<=hist_ram[128]+1'b1;
  408.                 129:hist_ram[129]<=hist_ram[129]+1'b1;
  409.                 130:hist_ram[130]<=hist_ram[130]+1'b1;
  410.                 131:hist_ram[131]<=hist_ram[131]+1'b1;
  411.                 132:hist_ram[132]<=hist_ram[132]+1'b1;
  412.                 133:hist_ram[133]<=hist_ram[133]+1'b1;
  413.                 134:hist_ram[134]<=hist_ram[134]+1'b1;
  414.                 135:hist_ram[135]<=hist_ram[135]+1'b1;
  415.                 136:hist_ram[136]<=hist_ram[136]+1'b1;
  416.                 137:hist_ram[137]<=hist_ram[137]+1'b1;
  417.                 138:hist_ram[138]<=hist_ram[138]+1'b1;
  418.                 139:hist_ram[139]<=hist_ram[139]+1'b1;
  419.                 140:hist_ram[140]<=hist_ram[140]+1'b1;
  420.                 141:hist_ram[141]<=hist_ram[141]+1'b1;
  421.                 142:hist_ram[142]<=hist_ram[142]+1'b1;
  422.                 143:hist_ram[143]<=hist_ram[143]+1'b1;
  423.                 144:hist_ram[144]<=hist_ram[144]+1'b1;
  424.                 145:hist_ram[145]<=hist_ram[145]+1'b1;
  425.                 146:hist_ram[146]<=hist_ram[146]+1'b1;
  426.                 147:hist_ram[147]<=hist_ram[147]+1'b1;
  427.                 148:hist_ram[148]<=hist_ram[148]+1'b1;
  428.                 149:hist_ram[149]<=hist_ram[149]+1'b1;
  429.                 150:hist_ram[150]<=hist_ram[150]+1'b1;
  430.                 151:hist_ram[151]<=hist_ram[151]+1'b1;
  431.                 152:hist_ram[152]<=hist_ram[152]+1'b1;
  432.                 153:hist_ram[153]<=hist_ram[153]+1'b1;
  433.                 154:hist_ram[154]<=hist_ram[154]+1'b1;
  434.                 155:hist_ram[155]<=hist_ram[155]+1'b1;
  435.                 156:hist_ram[156]<=hist_ram[156]+1'b1;
  436.                 157:hist_ram[157]<=hist_ram[157]+1'b1;
  437.                 158:hist_ram[158]<=hist_ram[158]+1'b1;
  438.                 159:hist_ram[159]<=hist_ram[159]+1'b1;
  439.                 160:hist_ram[160]<=hist_ram[160]+1'b1;
  440.                 161:hist_ram[161]<=hist_ram[161]+1'b1;
  441.                 162:hist_ram[162]<=hist_ram[162]+1'b1;
  442.                 163:hist_ram[163]<=hist_ram[163]+1'b1;
  443.                 164:hist_ram[164]<=hist_ram[164]+1'b1;
  444.                 165:hist_ram[165]<=hist_ram[165]+1'b1;
  445.                 166:hist_ram[166]<=hist_ram[166]+1'b1;
  446.                 167:hist_ram[167]<=hist_ram[167]+1'b1;
  447.                 168:hist_ram[168]<=hist_ram[168]+1'b1;
  448.                 169:hist_ram[169]<=hist_ram[169]+1'b1;
  449.                 170:hist_ram[170]<=hist_ram[170]+1'b1;
  450.                 171:hist_ram[171]<=hist_ram[171]+1'b1;
  451.                 172:hist_ram[172]<=hist_ram[172]+1'b1;
  452.                 173:hist_ram[173]<=hist_ram[173]+1'b1;
  453.                 174:hist_ram[174]<=hist_ram[174]+1'b1;
  454.                 175:hist_ram[175]<=hist_ram[175]+1'b1;
  455.                 176:hist_ram[176]<=hist_ram[176]+1'b1;
  456.                 177:hist_ram[177]<=hist_ram[177]+1'b1;
  457.                 178:hist_ram[178]<=hist_ram[178]+1'b1;
  458.                 179:hist_ram[179]<=hist_ram[179]+1'b1;
  459.                 180:hist_ram[180]<=hist_ram[180]+1'b1;
  460.                 181:hist_ram[181]<=hist_ram[181]+1'b1;
  461.                 182:hist_ram[182]<=hist_ram[182]+1'b1;
  462.                 183:hist_ram[183]<=hist_ram[183]+1'b1;
  463.                 184:hist_ram[184]<=hist_ram[184]+1'b1;
  464.                 185:hist_ram[185]<=hist_ram[185]+1'b1;
  465.                 186:hist_ram[186]<=hist_ram[186]+1'b1;
  466.                 187:hist_ram[187]<=hist_ram[187]+1'b1;
  467.                 188:hist_ram[188]<=hist_ram[188]+1'b1;
  468.                 189:hist_ram[189]<=hist_ram[189]+1'b1;
  469.                 190:hist_ram[190]<=hist_ram[190]+1'b1;
  470.                 191:hist_ram[191]<=hist_ram[191]+1'b1;
  471.                 192:hist_ram[192]<=hist_ram[192]+1'b1;
  472.                 193:hist_ram[193]<=hist_ram[193]+1'b1;
  473.                 194:hist_ram[194]<=hist_ram[194]+1'b1;
  474.                 195:hist_ram[195]<=hist_ram[195]+1'b1;
  475.                 196:hist_ram[196]<=hist_ram[196]+1'b1;
  476.                 197:hist_ram[197]<=hist_ram[197]+1'b1;
  477.                 198:hist_ram[198]<=hist_ram[198]+1'b1;
  478.                 199:hist_ram[199]<=hist_ram[199]+1'b1;
  479.                 200:hist_ram[200]<=hist_ram[200]+1'b1;
  480.                 201:hist_ram[201]<=hist_ram[201]+1'b1;
  481.                 202:hist_ram[202]<=hist_ram[202]+1'b1;
  482.                 203:hist_ram[203]<=hist_ram[203]+1'b1;
  483.                 204:hist_ram[204]<=hist_ram[204]+1'b1;
  484.                 205:hist_ram[205]<=hist_ram[205]+1'b1;
  485.                 206:hist_ram[206]<=hist_ram[206]+1'b1;
  486.                 207:hist_ram[207]<=hist_ram[207]+1'b1;
  487.                 208:hist_ram[208]<=hist_ram[208]+1'b1;
  488.                 209:hist_ram[209]<=hist_ram[209]+1'b1;
  489.                 210:hist_ram[210]<=hist_ram[210]+1'b1;
  490.                 211:hist_ram[211]<=hist_ram[211]+1'b1;
  491.                 212:hist_ram[212]<=hist_ram[212]+1'b1;
  492.                 213:hist_ram[213]<=hist_ram[213]+1'b1;
  493.                 214:hist_ram[214]<=hist_ram[214]+1'b1;
  494.                 215:hist_ram[215]<=hist_ram[215]+1'b1;
  495.                 216:hist_ram[216]<=hist_ram[216]+1'b1;
  496.                 217:hist_ram[217]<=hist_ram[217]+1'b1;
  497.                 218:hist_ram[218]<=hist_ram[218]+1'b1;
  498.                 219:hist_ram[219]<=hist_ram[219]+1'b1;
  499.                 220:hist_ram[220]<=hist_ram[220]+1'b1;
  500.                 221:hist_ram[221]<=hist_ram[221]+1'b1;
  501.                 222:hist_ram[222]<=hist_ram[222]+1'b1;
  502.                 223:hist_ram[223]<=hist_ram[223]+1'b1;
  503.                 224:hist_ram[224]<=hist_ram[224]+1'b1;
  504.                 225:hist_ram[225]<=hist_ram[225]+1'b1;
  505.                 226:hist_ram[226]<=hist_ram[226]+1'b1;
  506.                 227:hist_ram[227]<=hist_ram[227]+1'b1;
  507.                 228:hist_ram[228]<=hist_ram[228]+1'b1;
  508.                 229:hist_ram[229]<=hist_ram[229]+1'b1;
  509.                 230:hist_ram[230]<=hist_ram[230]+1'b1;
  510.                 231:hist_ram[231]<=hist_ram[231]+1'b1;
  511.                 232:hist_ram[232]<=hist_ram[232]+1'b1;
  512.                 233:hist_ram[233]<=hist_ram[233]+1'b1;
  513.                 234:hist_ram[234]<=hist_ram[234]+1'b1;
  514.                 235:hist_ram[235]<=hist_ram[235]+1'b1;
  515.                 236:hist_ram[236]<=hist_ram[236]+1'b1;
  516.                 237:hist_ram[237]<=hist_ram[237]+1'b1;
  517.                 238:hist_ram[238]<=hist_ram[238]+1'b1;
  518.                 239:hist_ram[239]<=hist_ram[239]+1'b1;
  519.                 240:hist_ram[240]<=hist_ram[240]+1'b1;
  520.                 241:hist_ram[241]<=hist_ram[241]+1'b1;
  521.                 242:hist_ram[242]<=hist_ram[242]+1'b1;
  522.                 243:hist_ram[243]<=hist_ram[243]+1'b1;
  523.                 244:hist_ram[244]<=hist_ram[244]+1'b1;
  524.                 245:hist_ram[245]<=hist_ram[245]+1'b1;
  525.                 246:hist_ram[246]<=hist_ram[246]+1'b1;
  526.                 247:hist_ram[247]<=hist_ram[247]+1'b1;
  527.                 248:hist_ram[248]<=hist_ram[248]+1'b1;
  528.                 249:hist_ram[249]<=hist_ram[249]+1'b1;
  529.                 250:hist_ram[250]<=hist_ram[250]+1'b1;
  530.                 251:hist_ram[251]<=hist_ram[251]+1'b1;
  531.                 252:hist_ram[252]<=hist_ram[252]+1'b1;
  532.                 253:hist_ram[253]<=hist_ram[253]+1'b1;
  533.                 254:hist_ram[254]<=hist_ram[254]+1'b1;
  534.                 255:hist_ram[255]<=hist_ram[255]+1'b1;
  535.                 default:;
  536.                 endcase
  537.                
  538.         end               
  539. end



  540. always@(posedge i_clk or negedge i_rst_n)
  541. begin
  542.         if(!i_rst_n)
  543.                 ap_start_flag <= 0;
  544.         else if(i_vsyn_d && (~i_vsyn))
  545.                 ap_start_flag <= 1;
  546.         else if(ap_start_cnt == 258)
  547.                 ap_start_flag <= 0;                        
  548. end

  549. always@(posedge i_clk or negedge i_rst_n)
  550. begin
  551.         if(!i_rst_n)
  552.                 ap_start_cnt <= 0;
  553.         else if(ap_start_flag)
  554.                 ap_start_cnt <= ap_start_cnt + 1;
  555.         else
  556.                 ap_start_cnt <= 0;
  557. end

  558. assign         ap_start                 = ap_start_flag;
  559. assign         hist_q0                  = hist_ram[hist_address0];
  560. assign         height                   = 720;                 
  561. assign         width                    = 1280;

  562. assign  o_valid                        = ap_done&ap_ready;
  563. assign  o_threshold          = ap_return;
  564.         
  565. xfOtsuKernel grp_xfOtsuKernel(
  566.     .ap_clk                        (ap_clk                                                        ),
  567.     .ap_rst                        (!i_rst_n                                                ),
  568.     .ap_start                (ap_start                                                ),
  569.     .ap_done                (ap_done                                                ),
  570.     .ap_idle                (                                                                ),
  571.     .ap_ready                (ap_ready                                                ),
  572.     .p_hist_address0(hist_address0                                        ),
  573.     .p_hist_ce0                (hist_ce0                                                ),
  574.     .p_hist_q0                (hist_q0                                                ),
  575.     .p_height                (height                                                        ),
  576.     .p_width                (width                                                        ),
  577.     .ap_return                (ap_return                                                )
  578. );

  579. endmodule
复制代码

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

3.2Vivadosim实验结果

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

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

79848c2aac27470e852ba309683c451b.jpg




6a20ec13d29d47a79f50c114fd16c3fb.jpg
96212c85850f4a0b8ca06707befbbc95.jpg
970b9c14fc864c0a94d14cb726f35a3f.jpg
54466946fdc841a3ab07e0283b76450e.jpg
3332e2ff4119453b844f1efb6a7c13df.jpg
fda734236c5e4464b7063c1e26770279.jpg
c8973afa9ed0480390206638d79b1afe.jpg
image.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则