FPGA图像处理--高斯模糊(二)

描述

在FPGA图像处理--高斯模糊(一)中介绍了怎么使用Python生成高斯模糊需要使用的高斯核,在这个文章中就介绍一下怎么在FPGA中完成高斯模糊。

首先我们使用Python生成一个高斯模糊的参考模型,代码如下:

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()

在上述代码中完成了读取一张图片,然后进行转灰度和进行高斯模糊的操作,并将原图和高斯模糊后图像数据存到了两个txt中,用于我们仿真。

在FPGA中完成高斯模糊比较简单,使用以下代码完成高斯矩阵的乘加。

图像处理

仿真代码:

首先使用一个模块来读取之前用python生成的原图数据,用于高斯模糊的激励。

图像处理

然后例化我们写的高斯模糊模块

图像处理

最后将仿真结果保存起来,并且在仿真的时候对dut输出的结果和参考模型进行比对,如果出现错误就停止仿真。

图像处理

仿真结果如下:

图像处理

在仿真的时候会实时打印DUT和参考模型的结果是否比对成功。因为设置了DUT和参考模型的结果之间的阈值为5,所以当两者差值在5以内时都会打印sim success。

仿真对比如下:

图像处理

 

 

图像处理

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分