版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页FPGA图像处理-Sobel边缘检测原理因为在做3*3卷积的时候,图像大小会变小,具体计算公式如下
其中O是输出特征图的大小,I是输入特征图的大小,P是Padding的大小,K是卷积核的大小,S是指Stride的大小,当K的值是3,P的值是1,S的值也是1,的时候O的值和I的值相等。
为了保持输出图像的大小在经过卷积后和输入的大小一样,我们需要进行Padding操作,在这里我采用了复制周围一圈的方式来完成。
采用(python)完成Sobel(算法)的参考模型
imp(or)tcv2ascvimportnumpyasnpimg=cv.imre(ad)(r"G:shiyan(IDc).jpg")img_gray=cv.cvtColor(img,cv.COLOR_RGB2GRAY)h,w=img_gray.shapeimg_padding=np.ze(ros)((h+2,w+2),np.uint8)img_padding[1:h+1,1:w+1]=img_grayimg_padding[0:1,1:w+1]=img_gray[0:1,:]img_padding[h+1:h+2,1:w+1]=img_gray[h-1:h,:]img_padding[:,0:1]=img_padding[:,1:2]img_padding[:,w+1:w+2]=img_padding[:,w:w+1]th=200sobel_(rf)=np.zeros((h,w),np.uint8)foriinrange(1,h):forjinrange(1,w):gx1=img_padding[i-1][j+1]+2*img_padding[i][j+1]+img_padding[i+1][j+1]gx2=img_padding[i-1][j-1]+2*img_padding[i][j-1]+img_padding[i+1][j-1]gy1=img_padding[i-1][j-1]+2*img_padding[i-1][j]+img_padding[i-1][j+1]gy2=img_padding[i+1][j-1]+2*img_padding[i+1][j]+img_padding[i+1][j+1]gx=abs(gx1-gx2)gy=abs(gy1-gy2)ifgx+gy>th:sobel_rf[i-1][j-1]=255else:sobel_rf[i-1][j-1]=0cv.imshow("sobel_rf",sobel_rf)cv.imshow("src",img_gray)cv.w(ai)tKey()cv.destroyAllWindows()
根据算法模型完成HDL:提供SpinalHDL源码
importspinal.core._importspinal.lib._classSobel(th:Int,imageColNum:Int,imageRowNum:Int)ex(te)ndsComponent{valio=newBundle{valdataIn=slave(ImageStream(8,imageColNum,imageRowNum,1))valdataOut=master(ImageStream(8,imageColNum,imageRowNum,1))}noIoPrefix()valgenMatrix=newGenMatrix(scala.math.pow(2,log2Up(imageColNum)).toInt,imageColNum,imageRowNum)genMatrix.io.dataInio.dataInvalgenMatrixOut=ImageStream(8,imageColNum,imageRowNum,9)genMatrixOut:=genMatrix.io.dataOutvalGX1=RegNext(genMatrixOut.data(0).asUInt+^(genMatrixOut.data(1)##B"1'b0").asUInt+^genMatrixOut.data(2).asUInt)valGX2=RegNext(genMatrixOut.data(6).asUInt+^(genMatrixOut.data(7)##B"1'b0").asUInt+^genMatrixOut.data(8).asUInt)valGX=Reg(UInt(11bits))valGY1=RegNext(genMatrixOut.data(6).asUInt+^(genMatrixOut.data(3)##B"1'b0").asUInt+^genMatrixOut.data(0).asUInt)valGY2=RegNext(genMatrixOut.data(8).asUInt+^(genMatrixOut.data(5)##B"1'b0").asUInt+^genMatrixOut.data(2).asUInt)valGY=Reg(UInt(11bits))when(GX1>GX2){GX:=GX1-GX2}otherwise{GX:=GX2-GX1}when(GY1>GY2){GY:=GY1-GY2}otherwise{GY:=GY2-GY1}valG=RegNext(GX+GY)valsobelOut=Reg(Bits(8bits))when(G>th){sobelOut:=255}otherwise{sobelOut:=0}io.dataOut.data(0):=sobelOutio.dataOut.row:=Delay(genMatrixOut.row,4)io.dataOut.col:=Delay(genMatrixOut.col,4)io.dataOut.c.hsync:=Delay(genMatrixOut.c.hsync,4,init=False)io.dataOut.c.vsync:=Delay(genMatrixOut.c.vsync,4,init=False)io.dataOut.c.de:=Delay(genMatrixOut.c.de,4,init=False)}objectSobelextendsApp{SpinalConfig().generate(Verilog)(newSobel(200,640,480))}
(仿真)代码:
importspinal.lib._importspinal.core._importspinal.core.(sim)._importscala.collec(ti)on.mutable.Queueimport(java).io.FileOutputStreamimportscala.io.SourceclasstbSobelC(th:Int)extendsSobel(th,430,430){varsrc=Array[String]()vardestDut=Array[String]()vardestRef=Array[String]()//varsrcLen=0varwidth=Array[Int]()varhigh=Array[Int]()valdutData=Queue[Int]()valrefData=Queue[Int]()varframeLen=0definit(srcFile:Array[String],destDu(tF)ile:Array[String],destRefFile:Array[String],imgShape:Array[(Int,Int)])={clockDomain.forkStimulus(10)io.dataIn.data(0)#=0io.dataIn.row#=0io.dataIn.col#=0src=srcFiledestDut=destDutFiledestRef=destRefFileio.dataIn.c.de#=falseio.dataIn.c.vsync#=falseio.dataIn.c.hsync#=falseframeLen=src.lengthwidth=imgShape.map(i=>i._1)high=imgShape.map(i=>i._2)clockDomain.waitSampling(10)}defframe(src:String,width:Int,high:Int)={valsrcFile=Source.fromFile(src)valsrcData=srcFile.getLines()varcolCnt=0varrowCnt=0io.dataIn.row#=widthio.dataIn.col#=highio.dataIn.c.de#=falseio.dataIn.c.vsync#=falseio.dataIn.c.hsync#=falseclockDomain.waitSampling(20)while(srcData.hasNext){valdata=srcData.next()io.dataIn.data(0)#=data.toIntio.dataIn.c.de#=trueif(colCnt==0&&rowCnt==0){io.dataIn.c.vsync#=trueprintln("xx")}else{io.dataIn.c.vsync#=false}if(colCnt==width-1&&rowCnt==high-1){clockDomain.waitSampling(1)io.dataIn.c.de#=falseclockDomain.waitSampling(200)}if(colCnt==0){io.dataIn.c.hsync#=true}else{io.dataIn.c.hsync#=false}if(colCnt==width-1&&rowCnt!=high-1){clockDomain.waitSampling(1)io.dataIn.c.de#=falseclockDomain.waitSampling(20)}if(colCnt==width-1){colCnt=0if(rowCnt==high-1){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国新能源汽车高压部件行业市场发展前景研究报告-智研咨询发布
- 照明设备安装标准化
- 2026年供桌行业分析报告及未来发展趋势报告
- 2026年血液处理设备行业分析报告及未来发展趋势报告
- 2026年无线音乐行业分析报告及未来发展趋势报告
- 产业园区桩基工程投标策略说明方案
- 办公场所消防器材管理办法
- 绿化草籽播种施工方案
- 金矿作业交底方案
- 2026年红外防水摄像机行业分析报告及未来发展趋势报告
- 2026年舟山绿色石化基地安全题库
- 岚图汽车招聘智能驾驶2026届春招及2027届招聘备考题库(含答案详解)
- 引流管护理的评估标准
- 意识形态保密工作制度
- 2026浙江杭州市临平区第二批招聘中小学事业编制教师160人备考题库附答案详解(综合题)
- 重庆南开中学校2025-2026学年九年级下学期3月月考语文试题(含答案)(含解析)
- 长江产业投资集团校招面笔试题及答案
- 2026年济南职业学院公开招聘高层次人才(38人)笔试参考题库及答案解析
- 2025年黄河出版传媒集团有限公司公开招聘工作人员笔试参考题库附带答案详解
- JBT 1306-2024 电动单梁起重机(正式版)
- 硫化成型日报点检表(橡胶)
评论
0/150
提交评论