Bilateral Filter双边滤波器

双边滤波器是一种边缘保护的非线性滤波器。

1.像高斯滤波器一样,它的权值取决于到中心像素的空间距离

原理:附近的像素(在空间中)应该比远处的像素有更大的影响

高斯滤波器:距离中心像素i (x, y)的空间偏移量(i, j)处的邻居的权值为:

Bilateral Filter双边滤波器_第1张图片

2.与高斯滤波器不同的是,它的权重同样取决于离中心像素的灰度值距离近。

原理:亮度值相似的像素比亮度值不同的像素影响更大。

3.双边滤波器:距离中心像素i (X,Y)的空间偏移量(i, j)处的邻居的权值由乘积给出

Bilateral Filter双边滤波器_第2张图片

Bilateral Filter双边滤波器_第3张图片

4. 实验结果

Bilateral Filter双边滤波器_第4张图片

5. Python简单实现

def gaussian(x, sigma):
    return (1.0/(2*numpy.pi*(sigma**2)))*numpy.exp(-(x**2)/(2*(sigma**2)))


def distance(x1, y1, x2, y2):
    return numpy.sqrt(numpy.abs((x1-x2)**2-(y1-y2)**2))


def bilateral_filter(image, diameter, sigma_i, sigma_s):
    new_image = numpy.zeros(image.shape)

    for row in range(len(image)):
        for col in range(len(image[0])):
            wp_total = 0
            filtered_image = 0
            for k in range(diameter):
                for l in range(diameter):
                    n_x = row - (diameter/2 - k)
                    n_y = col - (diameter/2 - l)
                    if n_x >= len(image):
                        n_x -= len(image)
                    if n_y >= len(image[0]):
                        n_y -= len(image[0])
                    gi = gaussian(image[int(n_x)][int(n_y)] - image[row][col], sigma_i)
                    gs = gaussian(distance(n_x, n_y, row, col), sigma_s)
                    wp = gi * gs
                    filtered_image = filtered_image + (image[int(n_x)][int(n_y)] * wp)
                    wp_total = wp_total + wp
            filtered_image = filtered_image // wp_total
            new_image[row][col] = int(numpy.round(filtered_image))
    return new_image

 

你可能感兴趣的:(数字图像处理)