Python 自适应加权引导滤波分层代码实现
以下是一个简单的自适应加权引导滤波分层的 Python 程序:
import cv2
import numpy as np
def adaptiveWeightedGuidedFilter(src, guide, radius, eps):
h, w = guide.shape[:2]
padded_guide = cv2.copyMakeBorder(guide, radius, radius, radius, radius, cv2.BORDER_REFLECT)
padded_src = cv2.copyMakeBorder(src, radius, radius, radius, radius, cv2.BORDER_REFLECT)
mean_I = cv2.boxFilter(padded_guide, -1, (2*radius+1, 2*radius+1), borderType=cv2.BORDER_REFLECT)
mean_p = cv2.boxFilter(padded_src, -1, (2*radius+1, 2*radius+1), borderType=cv2.BORDER_REFLECT)
mean_Ip = cv2.boxFilter(padded_guide * padded_src, -1, (2*radius+1, 2*radius+1), borderType=cv2.BORDER_REFLECT)
cov_Ip = mean_Ip - mean_I * mean_p
mean_II = cv2.boxFilter(padded_guide * padded_guide, -1, (2*radius+1, 2*radius+1), borderType=cv2.BORDER_REFLECT)
var_I = mean_II - mean_I * mean_I
a = cov_Ip / (var_I + eps)
b = mean_p - a * mean_I
mean_a = cv2.boxFilter(a, -1, (2*radius+1, 2*radius+1), borderType=cv2.BORDER_REFLECT)
mean_b = cv2.boxFilter(b, -1, (2*radius+1, 2*radius+1), borderType=cv2.BORDER_REFLECT)
mean_a = mean_a[radius:h+radius, radius:w+radius]
mean_b = mean_b[radius:h+radius, radius:w+radius]
q = mean_a * guide + mean_b
return q
def layeredAdaptiveWeightedGuidedFilter(src, guide, radius, eps, levels):
pyramid_src = [src]
pyramid_guide = [guide]
for i in range(levels):
pyramid_src.append(cv2.pyrDown(pyramid_src[-1]))
pyramid_guide.append(cv2.pyrDown(pyramid_guide[-1]))
q = pyramid_src[-1]
for i in range(levels-1, -1, -1):
q = adaptiveWeightedGuidedFilter(pyramid_src[i], pyramid_guide[i], radius, eps) + cv2.resize(q, pyramid_src[i].shape[::-1], interpolation=cv2.INTER_LINEAR)
return q
# 读取原始图像
img = cv2.imread('lena.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 添加高斯噪声
noise = np.random.normal(0, 50, gray.shape)
noisy_gray = gray + noise.astype(np.uint8)
# 自适应加权引导滤波分层
filtered = layeredAdaptiveWeightedGuidedFilter(noisy_gray, noisy_gray, 5, 0.01, 3)
# 显示结果图像
cv2.imshow('Original Image', gray)
cv2.imshow('Noisy Image', noisy_gray)
cv2.imshow('Filtered Image', filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()
这个程序首先定义了一个adaptiveWeightedGuidedFilter()函数,它实现了自适应加权引导滤波器。然后,它定义了一个layeredAdaptiveWeightedGuidedFilter()函数,它实现了自适应加权引导滤波分层。最后,它读取了一张原始图像,为它添加了高斯噪声,并对它进行自适应加权引导滤波分层,最终显示了原始图像、带噪图像和滤波后的图像。
原文地址: https://www.cveoy.top/t/topic/mMe0 著作权归作者所有。请勿转载和采集!