设为首页 加入收藏

TOP

基于 FPGA 的图像边缘检测(一)
2017-10-10 12:21:17 】 浏览:8045
Tags:基于 FPGA 图像 边缘 检测

本文主要内容是实现图像的边缘检测功能


目录

  1. mif文件的制作
  2. 调用 ip 核生成rom以及在 questasim 仿真注意问题
  3. 灰度处理
  4. 均值滤波:重点是3*3 像素阵列的生成
  5. sobel边缘检测
  6. 图片的显示   
  7. 结果展示                                                                                                                                                                                                       

mif文件的制作

受资源限制,将图片像素定为 160 * 120,将图片数据制成 mif 文件,对 rom ip 核进行初始化。mif文件的制作方法网上有好多办法,因此就不再叙述了,重点说mif文件的格式。 

1、mif文件的格式为:

 1 WIDTH=16 ;    //数据位宽
 2 DEPTH=19200 ;   // rom 深度即图片像素点的个数
 3 ADDRESS_RADIX=UNS ;   //地址数据格式
 4 DATA_RADIX=BIN ;   //数据格式
 5 CONTENT
 6 BEGIN
 7 0:1010110011010000 ;     // 地址 :数据 ;注意格式要和上面定义的保持统一
 8 1:1010110011010000 ;
 9 2:1010010010110000 ;
10 ......
11 19198:1110011011111001 ;
12 19199:1110011011011000 ;
13 END;

 


调用ip 核生成 rom 以及在 questasim 仿真注意问题

这部分内容已经在上篇博文中详细描述过,详情请见http://www.cnblogs.com/aslmer/p/5780107.html

 


 

灰度处理

任何颜色都由红、绿、蓝三原色组成,假如原来某点的颜色为( R,G,B )那么,我们可以通过下面几种方法,将其转换为灰度:
  • 浮点算法:Gray=0.299R+0.587G+0.114B
  • 平均值法:Gray=(R+G+B)/3;
  • 仅取单色(如绿色):Gray=G;
将计算出来的Gray值同时赋值给 RGB 三个通道即RGB为(Gray,Gray,Gray),此时显示的就是灰度图。通过观察调色板就能看明了。 通过观察可知,当RGB三个通道的值相同时即为灰色,Gray的值越大,颜色越接近白色,反之越接近黑色(这是我自己的理解,不严谨错误之处请大神指正)。
这是在线调色板网址,可以进去自己研究一下。 http://tool.chinaz.com/tools/selectcolor.aspx

--------------------------------------------------------------------------------------------------------------------

此次我采用是浮点算法来实现灰度图的,我的图片数据是RGB565 格式 ,

难点: 如何进行浮点运算。

思路:先将数据放大,然后再缩小。

例如:
Gray=0.299R+0.587G+0.114B转化为 Gray=(77R+150G+29B)>>8 即可,这里有一个技巧,若 a 为 16 位即 a [15:0],那么 a>>8 与 a [15:8]是一样的。
核心代码如下:
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
       red_r1   <= 0 ;  
       green_r1 <= 0 ;
       blue_r1  <= 0 ;
    end
    else begin
       red_r1   <= red   * 77 ;        //放大后的值
       green_r1 <= green * 150;
       blue_r1  <= blue  * 29 ;
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        Gray <= 0;    // 三个数之和
    end
    else begin
        Gray <= red_r1 + green_r1 + blue_r1;        
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
       post_data_in <= 0;  //输出的灰度数据
    end
    else begin
       post_data_in <= { Gray[13:9], Gray[13:8], Gray[13:9] };//将Gray值赋值给RGB三个通道
    end
end
 

均值滤波

均值滤波的原理

http://blog.csdn.net/hhygcy/article/details/4325304 (此处引用 hhygcy 的文章)

难点:如何生成 3*3 的像素阵列。

我们可以利用 ip 核生成移位寄存器 ,方法与 ip 核 生成 rom 一样,详情见目录 2 因此不再赘述 。

仿真波形如下 row_1 , row_2 , row_3 是指图像的第一、二、三行的数据,Per_href 是行有效信号(受VGA时序的启发,从 rom 中读取数据时设计了行有效和场有效的控制信号,事半功倍,有了利于仿真查错和数据的控制)。从 3 开始就出现了3*3 的像素阵列,这时候就可以求取周围 8 个像素点的平均值,进行均值滤波。

 

下面这个图是我自己画的 FPGA 如何将矩阵数据处理成并行的像素点,可以结合下面的代码好好理解,这也是精华所在。

正方形红框框起来的是第一个完整的 3*3 矩阵,长方形红框框起来的是并行的像素点,在此基础上就可以求得平均值,进行均值滤波。

从下图也能看到 3*3 矩阵从左往右滑动。

第一个3*3 阵列。

0  1  2   -- >  p11 p12 p13

3  4  

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇verilog 实现中值滤波 下一篇SDRAM 学习(三)之command

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目