您当前的位置:首页 > 美文欣赏 > 内容

sobel算子用法(Sobel算子原理介绍与实现方法)

sobel算子用法(Sobel算子原理介绍与实现方法)

索贝尔原理简介

Sobel算子主要用于边缘检测。技术上是离散差分算子,用来计算图像亮度函数的灰度近似值。在图像中的任何一点使用该算子都会产生相应的灰度矢量或其法向量,Sobel卷积因子为:

该运算符包含两组3x3矩阵,分别为水平和垂直。通过与图像卷积,可以分别获得水平和垂直亮度差的近似值。如果A代表原始图像,Gx和Gy分别代表水平和垂直边缘检测到的图像灰度值,公式如下:

具体计算如下:

Gx=(-1)*f(x-1,y-1) 0*f(x,y-1) 1*f(x 1,y-1)

(-2)*f(x-1,y) 0*f(x,y) 2*f(x 1,y)

(-1)*f(x-1,y 1) 0*f(x,y 1) 1*f(x 1,y 1)

=[f(x 1,y-1) 2*f(x 1,y) f(x 1,y 1)]-[f(x-1,y-1) 2*f(x-1,y) f(x-1,y 1)]

Gy=1* f(x-1,y-1) 2*f(x,y-1) 1*f(x 1,y-1)

0*f(x-1,y) 0*f(x,y) 0*f(x 1,y)

(-1)*f(x-1,y 1) (-2)*f(x,y 1) (-1)*f(x 1,y 1)

=[f(x-1,y-1) 2f(x,y-1) f(x 1,y-1)]-[f(x-1,y 1) 2*f(x,y 1) f(x 1,y 1)]

其中f(a,b)表示图像中点(a,b)的灰度值;

图像中每个像素的水平和垂直灰度值通过以下公式结合起来计算该点的灰度值:

一般为了提高效率,用平方根的近似值。

Sobel算子是根据一个像素的上、下、左、右邻居的灰度加权差在边缘处达到极值的现象来检测边缘的。可以平滑噪声,提供更准确的边缘方向信息,边缘定位精度不够高。在精度不是很高的情况下,是常用的边缘检测方法。

Sobel算子在HLS上的实现

工程创造

第一步:打开Vivado HLS开发工具,点击新建项目,新建一个项目,设置项目路径和项目名称,一直点击下一步,默认设置。

第二步:出现下图界面,时钟周期默认为10ns,不确定,默认为解决方案名称。单击红色箭头选择芯片类型,然后单击确定。

点击完成,出现如下界面

步骤4:右键单击Source选项,选择New File,创建一个名为Top.cpp的文件(一定要添加cpp后缀)

第五步:打开新建的cpp文件,进入编辑状态,输入以下代码

Top.cpp代码# include top.h void HLS _ Sobel(axi _ STREAM INPUT _ STREAM,axi _ streamoutput _ stream,introws,int cols){//为核心创建axi流接口#pragma HLS接口轴port=INPUT_STREAM#pragma HLS接口轴port=OUTPUT_STREAM# pragma HLS资源core=AXI_SLAVE变量=rows元数据=-总线束控制总线# pragma HLS RESOURCE core=AXI _从属变量=列元数据=-总线束控制总线# pragma HLS RESOURCE core=AXI _从属变量=返回元数据=-总线束控制总线#pragma HLS接口ap_stable port=rows#pragma HLS接口AP _ stable port=cols RGB _ IMAGE img _ 0(rows,cols);RGB_IMAGE img_1(rows,cols);RGB_IMAGE img_2(rows,cols);RGB_IMAGE img_3(rows,cols);RGB_IMAGE img_4(rows,cols);RGB_IMAGE img_5(rows,cols);RGB_PIXEL pix(50,50,50);# pragma HLS data flow HLS:axi video 2 mat(INPUT _ STREAM,img _ 0);hls:Sobel(img_0,img _ 1);hls:SubS(img_1,pix,img _ 2);hls:Scale(img_2,img_3,2,0);hls:Erode(img_3,img _ 4);hls:Dilate(img_4,img _ 5);hls:Mat2AXIvideo(img_5,OUTPUT_STREAM)}

步骤6:在源代码中添加另一个名为Top.h的库函数,并添加以下程序:

top . h code # ifndeftop _ h # define top _ h # include HLS _ video.h //maximumimagesize # define max _ width 512 # define max _ height 512//I/o IMAGE settings # define INPUT _ IMAGE lena.jpg #定义输出图像result.jpg # define OUTPUT _ IMAGE _ GOLDEN result _ golden.jpg //typedef文章库核心结构typedef HLS:STREAM AXI _ STREAM;typedef hls:标量RGB _ PIXELtypedef HLS:matr GB _ IMAGE;//HW synthesis void HLS _ Sobel(AXI _ STREAM src _ axi,AXI_STREAM dst_axi,int rows,int cols)的顶级函数;#endif

步骤7:在测试平台中,用同样的方法添加一个名为Test.cpp的测试程序。添加以下代码:

测试。卡片打印处理机(Card Print Processor的缩写)代码#包括顶端。h #包括opencv _ top。h 使用命名空间标准使用名称空间cv;int main (int argc,char** argv){//获取图像数据IPL IMAGE * src=cvLoadImage(INPUT _ IMAGE);IPL image * dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);

//使用HLS库进行处理AXI_STREAM src_axi,dst _ axiipimage 2 axi文章(src,src _ axi);hls_sobel(src_axi,dst_axi,src-height,src-width);axi文章2 plimage(dst _ axi,dst);cvSaveImage(OUTPUT_IMAGE,dst);cvShowImage(hls _ dst ,dst);//使用OPENCV库进行处理opencv_image_filter(src,dst);cvShowImage(cv _ dst ,dst);cvSaveImage(OUTPUT _ IMAGE _ GOLDEN,dst);等待键(0);//释放内存cvReleaseImage(src);cvReleaseImage(dst);}

第八步:用同样的方法,再在试验台中创建一个opencv_top.cpp和opencv_top.h文件,添加如下程序:

Opencv_top.cpp代码#包括opencv _ top。h #包括顶端。h void opencv _ image _ filter(IPL image * src,IPL image * dst){ IPL image * tmp=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);cvCopy(src,tmp);cv:Mat)tmp,(cv:Mat)dst,-1,1,0);cvSubS(dst,cvScalar(50,50,50),tmp);cvScale(tmp,dst,2,0);cvErode(dst,tmp);cvdilat(tmp,dst);cvReleaseImage(tmp);} void SW _ image _ filter(IPL image * src,IPL image * dst){ AXI _流src_axi,dst _ axiipimage 2 axi文章(src,src _ axi);hls_sobel(src_axi,dst_axi,src-height,src-width);axi文章2 plimage(dst _ axi,dst);}

opencv_top.h代码# ifndefOPENCV _ TOP _ H _ _ # define _ _ _ OPENCV _ TOP _ H # include HLS _ OPENCV。H void OPENCV _ image _ filter(IPL image * src,IPL image * dst);void SW _ image _ filter(IPL image * src,IPL image * dst);#endif

第七步:在试验台中添加一张名为lena.jpg的测试图片

接下来对工程进行编译和仿真。

第一步:单击项目-项目设置或直接单击快捷按钮。

第二步:选择综合选项,然后点击浏览.指定一个顶层函数,选定赫尔斯索贝尔为顶层函数,

单击开始综合

在协议类型里面我们可以看到我们主要使用了三种协议,分别是轴、ap _稳定和ap_ctrl_hs三种,这些协议的详细解释我们均可以在官方手册ug902中找到,其中ap_ctrl_hs的时序操作如下图所示,说简单点就是复位完成等待ap _开始信号开始进行操作

综合完毕,我们对代码进行仿真测试,单击开始仿真

仿真结果如下,与通过OPENCV实现的索贝尔检测结果基本一致。

审核汤梓红

标签:图像dst边缘


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: oppor823(oppor823t怎么截屏)

下一篇: 雅迪电动车质量如何样(雅迪电动车质量如何)



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号