码迷,mamicode.com
首页 > 编程语言 > 详细

灰度图像的sobel边缘检测算法

时间:2017-09-02 12:58:01      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:src   移位   sys   set   变量声明   图像   eset   简单的   data   

之前上一篇文章写了如何将图片进行灰度化处理,这篇文章参考CB的文章简单的介绍一下如何进行sobel边缘化处理。

边缘 : 周围像素灰度急剧变化的那些像素的集合,它是图像最基本的特征

公式 : 技术分享

    技术分享

这里Gx和Gy分别代表横向及纵向边缘检测的图像灰度值,该点灰度值大小为G,式子里A代表经过灰度

处理的原始图像,最终计算出来的结果和设定的阈值进行比较如果大于阈值显示一个颜色,否则就显示其他

颜色即可。

 

 

 

采用流水线的方法:

  1、移位,A是一个3X3的矩阵,需要不断的刷新,我用的是9个寄存器,每一个时钟就刷新一次。

  2、计算Gx 和Gy,矩阵相乘展开以后就是几个数据相乘,因为矩阵因子里面有负数,所以需要

          比较大小,把正值给保留下来。

  3、求平方和

  4、利用altera自带的IP核,实现开根号处理。

  5、跟阈值进行比较

/*-----------------------------------------------------------------------

Date                :        2017-XX-XX
Description            :        Design for .

-----------------------------------------------------------------------*/

module sobel
(
    //global clock
    input                    clk,            //system clock
    input                    rst_n,             //sync reset
    
    //gray interface
    input            [7:0]    gray,
    
    //sobel    interface
    output            [10:0]    sobel_data
    
); 


//--------------------------------
//Funtion :  变量声明

reg            [7:0]        matrix_p11 , matrix_p12 , matrix_p13;
reg            [7:0]        matrix_p21 , matrix_p22 , matrix_p23;
reg            [7:0]        matrix_p31 , matrix_p32 , matrix_p33;

reg            [9:0]        gx_temp1;
reg            [9:0]        gx_temp2;
reg            [9:0]        gx_data;

reg            [9:0]        gy_temp1;
reg            [9:0]        gy_temp2;
reg            [9:0]        gy_data;             

reg            [20:0]        gxy_square;
//--------------------------------
//Funtion :  移位

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        matrix_p11 <= 1d0;
        matrix_p12 <= 1d0;
        matrix_p13 <= 1d0;
        matrix_p21 <= 1d0;
        matrix_p22 <= 1d0;
        matrix_p23 <= 1d0;
        matrix_p31 <= 1d0;
        matrix_p32 <= 1d0;
        matrix_p33 <= 1d0;        
    end
    else
    begin
        matrix_p11 <= gray;
        matrix_p12 <= matrix_p11;
        matrix_p13 <= matrix_p12;
        matrix_p21 <= matrix_p13;
        matrix_p22 <= matrix_p21;
        matrix_p23 <= matrix_p22;
        matrix_p31 <= matrix_p23;
        matrix_p32 <= matrix_p31;
        matrix_p33 <= matrix_p32;    
    end
end


//--------------------------------
//Funtion :  计算Gx Gy

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        gx_temp1 <= 1d0;
        gx_temp2 <= 1d0;
        gx_data     <= 1d0;
    end
    else
    begin
        gx_temp1 <= matrix_p31 + (matrix_p32 << 1) + matrix_p33;
        gx_temp2 <= matrix_p11 + (matrix_p12 << 1) + matrix_p13;
        gx_data  <= (gx_temp1 >= gx_temp2) ? gx_temp1 - gx_temp2 : gx_temp2 - gx_temp1;
    end
end

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        gy_temp1 <= 1d0;
        gy_temp2 <= 1d0;
        gy_data     <= 1d0;
    end
    else
    begin
        gy_temp1 <= matrix_p11 + (matrix_p21 << 1) + matrix_p31;
        gy_temp2 <= matrix_p13 + (matrix_p23 << 1) + matrix_p33;
        gy_data  <= (gy_temp1 >= gy_temp2) ? gy_temp1 - gy_temp2 : gy_temp2 - gy_temp1;
    end
end

//--------------------------------
//Funtion :  gx^2 + gy^2

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        gxy_square <= 1d0;
    else
        gxy_square <= gx_data * gx_data + gy_data * gy_data;
end


//--------------------------------
//Funtion :  sqrt

sqrt_sobel sqrt_inst(
    .radical(gxy_square),
    .q(sobel_data),
    //remainder
    );






endmodule
    

 

 

 

 

技术分享

灰度图像的sobel边缘检测算法

标签:src   移位   sys   set   变量声明   图像   eset   简单的   data   

原文地址:http://www.cnblogs.com/bixiaopengblog/p/7466212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!