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实现的索贝尔检测结果基本一致。
审核汤梓红
推荐阅读
- 新一代人工智能的发展规划是什么(新一代人工智能的发展规划)
- 商标分类45大类明细 1一45类商标经营范围
- 七座国产MPV哪种车好?(国产最好七座mpv)
- myeclipse 2013 中文破解版软件介绍(myeclipse 2013 中文破解版)
- 怎样查询老赖的隐藏地点? 免费查询老赖
- psp3000能玩哪些游戏(psp 3000)
- 哈佛h6自动档如何操作,哈佛H6经典款自动档操作方法
- 离婚后哪三样东西必须归女方? 离婚后哪三样东西必须归女方
- 常见的数据库系统有哪些类型(常见的数据库系统有哪些)
- 海信电脑显示器(海信电脑)
- s5的共轭类元素个数 s5
- 统一身份认证系统是什么? 身份认证系统
- 洗衣机面板坏了怎么修(洗衣机面板)
- 自恢复保险丝的作用(自恢复保险丝的寿命有多长)
- 宝宝汽车安全座椅怎么选,安全座椅如何选购便宜
- lv是什么牌子(lv是什么)
- 退休金计算公式2021计算器 2021退休金计算器
- 什么是架构设计(如何进行架构设计)
- 6220CPU(6220c)