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

之前上一篇文章写了如何将图片进行灰度化处理,这篇文章参考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 <= 1‘d0;
        matrix_p12 <= 1‘d0;
        matrix_p13 <= 1‘d0;
        matrix_p21 <= 1‘d0;
        matrix_p22 <= 1‘d0;
        matrix_p23 <= 1‘d0;
        matrix_p31 <= 1‘d0;
        matrix_p32 <= 1‘d0;
        matrix_p33 <= 1‘d0;
    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 <= 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
    );

endmodule
    

时间: 2024-10-05 11:40:06

灰度图像的sobel边缘检测算法的相关文章

Sobel边缘检测算法

Sobel边缘检测算法 转载请注明出处:  http://blog.csdn.net/tianhai110 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值.在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量 Sobel卷积因子为: 该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值.如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰

Sobel边缘检测算法(转载)

转载请注明出处:  http://blog.csdn.net/tianhai110 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值.在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量 Sobel卷积因子为: 该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值.如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下: 具体

基于FPGA的Sobel边缘检测的实现

前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Canny算子边缘检测.腐蚀和膨胀等.那么这篇文章我们将来实现基于FPGA的Sobel边缘检测. 图像边缘:简言之,边缘就是图像灰度值突变的地方,亦即图像在该部分的像素值变化速度非常之快,这就好比在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大. Sobel算子主要用作边缘检测,在技术

基于Vivado HLS在zedboard中的Sobel滤波算法实现

 基于Vivado HLS在zedboard中的Sobel滤波算法实现 平台:zedboard  + Webcam 工具:g++4.6  + VIVADO HLS  + XILINX EDK + XILINX SDK 系统:ubuntu12.04 总体设计思路 sobel 算法理论基础       索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值.在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量. 该

基于matlab的经典图像边缘检测算法

图像边缘检测算法 (1)Robert算子边缘检测 (2)Sobel算子边缘检测 (3)Prewitt算子边缘检测 (4)LOG算子边缘检测 (5)Canny边缘检测 Matlab的实现. 其实还只是掉包侠,一点算法没有写 争取有空用openCV写一遍 I=imread('1.jpg'); I0=rgb2gray(I); subplot(231); imshow(I); BW1=edge(I0,'Roberts',0.16); subplot(232); imshow(BW1); title('R

Canny边缘检测算法原理及其VC实现详解(一)

转自:http://blog.csdn.net/likezhaobin/article/details/6892176 图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值.图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的,同时也是图象分割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量.检测和定位,自从1959提出边缘检测以来,经过五十多年

灰度图像--图像分割 Canny边缘检测

学习DIP第48天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://github.com/Tony-Tan/DIPpro 开篇废话 废话开始,Canny大名鼎鼎,大家都称之为Canny算子,包括wiki上也是写的Canny detector,但是按照我的理解,我觉得叫做Canny算法比较合适,但如果叫做算子,那也应该叫做复合算子,因为Canny本身并不是一个线性模板(

一些关于Canny边缘检测算法的改进

传统的Canny边缘检测算法是一种有效而又相对简单的算法,可以得到很好的结果(可以参考上一篇Canny边缘检测算法的实现).但是Canny算法本身也有一些缺陷,可以有改进的地方. 1. Canny边缘检测第一步用高斯模糊来去掉噪声,但是同时也会平滑边缘,使得边缘信息减弱,有可能使得在后面的步骤中漏掉一些需要的边缘,特别是弱边缘和孤立的边缘,可能在双阀值和联通计算中被剔除.很自然地可以预见,如果加大高斯模糊的半径,对噪声的平滑力度加大,但也会使得最后得到的边缘图中的边缘明显减少.这里依然用Lena

zedboard zynq 学习 sobel 边缘检测 IP核 制作 根据 文档 Xapp890

官方文档http://www.xilinx.com/support/documentation/application_notes/xapp890-zynq-sobel-vivado-hls.pdf 准备工作 下载 工程文件 http://pan.baidu.com/s/1eQqwjBk 这是我用百度云分享的 如果不行了, 可以用 官方链接 https://secure.xilinx.com/webreg/clickthrough.do?cid=193509 sobel 算子边缘检测原理 这里不