FPGA圖像處理-Sobel邊緣檢測原理_第1頁
FPGA圖像處理-Sobel邊緣檢測原理_第2頁
FPGA圖像處理-Sobel邊緣檢測原理_第3頁
FPGA圖像處理-Sobel邊緣檢測原理_第4頁
FPGA圖像處理-Sobel邊緣檢測原理_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第第頁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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論