在FPGA圖像處理--高斯模糊(一)中介紹了怎么使用Python生成高斯模糊需要使用的高斯核,在這個(gè)文章中就介紹一下怎么在FPGA中完成高斯模糊。
首先我們使用Python生成一個(gè)高斯模糊的參考模型,代碼如下:
import cv2 as cv
import numpy as np
img_path = "./sim/img/img.png"
img = cv.imread(img_path)
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
h, w = img_gray.shape
# kernel_1d = cv.getGaussianKernel(3, 0.8, ktype=cv.CV_32F)
# kernel_2d = kernel_1d * kernel_1d.T
# kernel_2d = kernel_2d * (1 / kernel_2d[0][0])
# print(kernel_2d)
gauss_kernel = [[1, 2, 1],
                [2, 4, 2],
                [1, 2, 1]]
img_padding = np.zeros((h + 2, w + 2), np.uint8)
img_padding[1:h + 1, 1:w + 1] = img_gray
img_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]
# gauss_img = cv.GaussianBlur(img_gray, (3, 3), 0.8)
gauss_img = np.zeros((h, w), np.uint8)
for i in range(1, h + 1):
    for j in range(1, w + 1):
        gauss_img[i - 1][j - 1] = (img_padding[i - 1][j - 1] * gauss_kernel[0][0] + img_padding[i - 1][j] *
                                   gauss_kernel[0][1] + img_padding[i - 1][j + 1] * gauss_kernel[0][2] + img_padding[i][
                                       j - 1] * gauss_kernel[1][0] + img_padding[i][j] * gauss_kernel[1][1] +
                                   img_padding[i][j + 1] * gauss_kernel[1][2] + img_padding[i + 1][j - 1] *
                                   gauss_kernel[2][0] + img_padding[i + 1][j] * gauss_kernel[2][1] + img_padding[i + 1][
                                       j + 1] * gauss_kernel[2][2]) / 16
def save_file(img, path):
    fp = open(path,'w')
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if i == img.shape[0] - 1 and j == img.shape[1] - 1:
                fp.write(str(img[i][j]))
            else:
                fp.write(str(img[i][j]) + "
")
    fp.close
def img2txt(img, dst):
    f = open(dst,"w")
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if i == img.shape[0] - 1 and j == img.shape[1] - 1:
                f.write(str(img[i][j][0]) + " " + str(img[i][j][1]) + " " + str(img[i][j][2]))
            else:
                f.write(str(img[i][j][0]) + " " + str(img[i][j][1]) + " " + str(img[i][j][2])  + "
")
            
    f.close()
file_path = "./sim/test.txt"
file_path_ref = "./sim/ref.txt"
img2txt(img, file_path)
save_file(gauss_img, file_path_ref)
cv.imshow("lena", img_gray)
cv.imshow("lena_gauss_img", gauss_img)
cv.waitKey()
cv.destroyAllWindows()
	在上述代碼中完成了讀取一張圖片,然后進(jìn)行轉(zhuǎn)灰度和進(jìn)行高斯模糊的操作,并將原圖和高斯模糊后圖像數(shù)據(jù)存到了兩個(gè)txt中,用于我們仿真。
在FPGA中完成高斯模糊比較簡單,使用以下代碼完成高斯矩陣的乘加。
		
仿真代碼:
首先使用一個(gè)模塊來讀取之前用python生成的原圖數(shù)據(jù),用于高斯模糊的激勵。
		
然后例化我們寫的高斯模糊模塊
		
最后將仿真結(jié)果保存起來,并且在仿真的時(shí)候?qū)ut輸出的結(jié)果和參考模型進(jìn)行比對,如果出現(xiàn)錯誤就停止仿真。
		
仿真結(jié)果如下:
		
在仿真的時(shí)候會實(shí)時(shí)打印DUT和參考模型的結(jié)果是否比對成功。因?yàn)樵O(shè)置了DUT和參考模型的結(jié)果之間的閾值為5,所以當(dāng)兩者差值在5以內(nèi)時(shí)都會打印sim success。
仿真對比如下:
		
		
- 
                                FPGA
                                +關(guān)注
關(guān)注
1652文章
22232瀏覽量
628562 - 
                                圖像處理
                                +關(guān)注
關(guān)注
28文章
1339瀏覽量
59072 - 
                                python
                                +關(guān)注
關(guān)注
56文章
4850瀏覽量
89313 
原文標(biāo)題:FPGA圖像處理--高斯模糊(二)
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
模糊圖像處理解決方案
FPGA設(shè)計(jì)經(jīng)驗(yàn)之圖像處理
FPGA圖像與視頻處理培訓(xùn)
【NanoPi M2試用體驗(yàn)】圖像的模糊
區(qū)間二型模糊的高斯型隸屬度函數(shù)Matlab仿真的問題
基于FPGA的圖像平滑處理
【FPGA學(xué)習(xí)案例分享】基于FPGA的圖像邊緣檢測例程
薦讀:FPGA設(shè)計(jì)經(jīng)驗(yàn)之圖像處理
基于梯度方向直方圖與高斯金字塔的車牌模糊漢字識別方法
    
基于FPGA灰度圖像高斯濾波算法的實(shí)現(xiàn)
    
基于FPGA圖像處理的高斯模糊實(shí)現(xiàn)
    
          
        
        
FPGA圖像處理--高斯模糊(二)
                
 
    
           
            
            
                
            
評論