EEPROM带电可擦可编程IC存储器芯片大全-亿配芯城-基于FPGA图像处理的高斯模糊实现
你的位置:EEPROM带电可擦可编程IC存储器芯片大全-亿配芯城 > 芯片产品 > 基于FPGA图像处理的高斯模糊实现
基于FPGA图像处理的高斯模糊实现
发布日期:2023-12-27 15:03     点击次数:140

高斯模糊(Gaussian Blur)是一种高斯低通滤波,可以过滤掉图像的高频部分,保留低频部分,对于去除高斯噪声非常有效果,常常被用于图像去噪中。

在做图像模糊的时候最直接的想法就是在当前像素上取一个3*3或者5*5的窗口,把窗口里面的数字相加再求一个平均,得到的均值作为新的当前像素的值,这也就是均值滤波。

高斯滤波认为窗口中的每个像素对当前像素的影响是不一样的,和当前像素越接近影响就越大。因此加权平均更加合理,相近的像素值权重就比较大,相远的权重就小。

在利用高斯滤波的时候首先需要去生成一个高斯核,芯片交易网IC交易网二维高斯函数如下:

在计算每个像素值时, EEPROM带电可擦可编程存储器芯片大全可以将其视为坐标的原点, ATMEGA系列ATMEL芯片COM这样可以将视为0, 电子元器件PDF资料大全就可以简化二维高斯函数如下:

可以使用如下python代码来生成一个高斯核:

import cv2 as cv
import numpy as np
sigma = 0.8
kernel = np.zeros((3,
CMOS图像传感器集成电路芯片 3))
for i in range(-1, 2):
    for j in range(-1,EEPROM带电可擦可编程存储器芯片大全 2):
        kernel[i + 1][j + 1] = 1.0 / (2 * np.pi * sigma * sigma) * np.exp(-((i * i + j * j) / (2.0 * sigma * sigma)))


print(kernel)

3c084cb2-739f-11ee-939d-92fbcf53809c.png

在OpenCV中也提供了getGaussianKernel这个函数来获取一个高斯核,他的函数定义如下:

def getGaussianKernel(ksize, sigma, ktype=None)

第一个参数ksize代表高斯核的尺寸,这里会生成一个ksize*1的高斯核。

对于二维的高斯核生成方式如下:

import cv2 as cv
import numpy as np
sigma = 0.8
opencv_gaussian_kernel_x = cv.getGaussianKernel(3, 0.8)
opencv_gaussian_kernel_y = cv.getGaussianKernel(3, 0.8)
opencv_gaussian_kernel = opencv_gaussian_kernel_x * opencv_gaussian_kernel_y.T
print(opencv_gaussian_kernel)

3c1a64e2-739f-11ee-939d-92fbcf53809c.png

可以看到两者是不一样的,那是因为我们没有对我们自己写的求出来的高斯模板进行归一化。

然后对其进行归一化,使其权重相加的和为1

kernel = kernel / kernel.sum()
print(kernel)

3c273258-739f-11ee-939d-92fbcf53809c.png

可见归一化后的结果就和OpenCV提供的函数计算出来的结果就一样了。

最后对齐转换为整数,左上角的数据变为1

kernel = np.int32(kernel / kernel[0][0])
print(kernel)
print("1/" + str(kernel.sum()))

3c2ecaf4-739f-11ee-939d-92fbcf53809c.png

这样就可以得到完整的高斯模板了。

完整的python代码如下:

import cv2 as cv
import numpy as np


sigma = 0.8
opencv_gaussian_kernel_x = cv.getGaussianKernel(3, 0.8)
opencv_gaussian_kernel_y = cv.getGaussianKernel(3, 0.8)
opencv_gaussian_kernel = opencv_gaussian_kernel_x * opencv_gaussian_kernel_y.T
print(opencv_gaussian_kernel)


kernel = np.zeros((3, 3))
for i in range(-1, 2):
    for j in range(-1, 2):
        kernel[i + 1][j + 1] = 1.0 / (2 * np.pi * sigma * sigma) * np.exp(-((i * i + j * j) / (2.0 * sigma * sigma)))


print(kernel)


kernel = kernel / kernel.sum()
print(kernel)


kernel = np.int32(kernel / kernel[0][0])
print(kernel)
print("1/" + str(kernel.sum()))
 编辑:黄飞