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


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

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

    公式 : 

        

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

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

    颜色即可。

    采用流水线的方法:

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

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

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

      3、求平方和

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

      5、跟阈值进行比较

    矩阵:

    3X3矩阵采用的是altera自带的ip核,移位ip核taps是指有几层,如果把data_in算进去的话,taps两层即可,distance是指距离,每一层的长度是多少,distance

    也对应sobel处理的图片长度,移位ip核运行原理类似与弹珠游戏,新的数据把旧的数据向前推。

    时钟延时:

      因为流水线数据处理有延时,所以最终vga显示使能也需要将移动相应的时钟来保持同步

    /*-----------------------------------------------------------------------
    
    Date                :        2017-XX-XX
    Description            :        Design for sobel.
    
    -----------------------------------------------------------------------*/
    
    module sobel
    (
        //global clock
        input                    clk                    ,            //system clock
        input                    rst_n                ,             //sync reset
        
        
        //sobel    interface
        output            [10:0]    sobel_data            ,
        
        //matrix     interface
        input            [ 7:0]   matrix_p11 , matrix_p12 , matrix_p13 ,
        input            [ 7:0]   matrix_p21 , matrix_p22 , matrix_p23 ,
        input            [ 7:0]   matrix_p31 , matrix_p32 , matrix_p33 ,
    
        //en
        input                    mean_en                ,
        output                    display_val        
        
    ); 
    
    
    //--------------------------------
    //Funtion :  变量声明
    
    
    
    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                                            ;
    reg            [ 4:0]        delay_en                                            ;
    
    //--------------------------------
    //Funtion :  计算Gx Gy
    
    always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
        begin
            gx_temp1 <= 1'd0;
            gx_temp2 <= 1'd0;
            gx_data     <= 1'd0;
        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 <= 1'd0;
            gy_temp2 <= 1'd0;
            gy_data     <= 1'd0;
        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 <= 1'd0;
        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
        );
    
    //--------------------------------
    //Funtion :  delay_en
    
    always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            delay_en <= 1'd0;
        else
            delay_en <= {delay_en[3:0] , mean_en};
    end
    
    assign    display_val = delay_en[4];
    
    
    endmodule
        
  • 相关阅读:
    。。。剑指Offer之——二叉树的镜像。。。
    。。。剑指Offer之——树的子结构。。。
    。。。剑指Offer之——合并两个排序的链表。。。
    。。。剑指Offer之——反转链表。。。
    。。。剑指Offer之——链表中倒数第k个结点。。。
    。。。剑指Offer之——调整数组顺序使奇数位于偶数前面。。。
    。。。剑指Offer之——数值的整数次方。。。
    。。。剑指Offer之——二进制中1的个数。。。
    。。。剑指Offer之——跳台阶。。。
    。。。剑指Offer之——斐波那契数列。。。
  • 原文地址:https://www.cnblogs.com/bixiaopengblog/p/7466212.html
Copyright © 2020-2023  润新知