第5章 Python 数字图像处理(DIP) - 图像复原与重建16 - 约束最小二乘方滤波、几何均值滤波

约束最小二乘方滤波

F ^ ( u , v ) = [ H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 + γ ∣ P ( u , v ) ∣ 2 ] G ( u , v ) (5.89) \hat{F}(u,v) = \bigg[\frac{H^*(u,v)}{|H(u,v)|^2 + \gamma |P(u,v)|^2} \bigg]G(u,v) \tag{5.89} F^(u,v)=[H(u,v)2+γP(u,v)2H(u,v)]G(u,v)(5.89)

P ( u , v ) 为 函 数 p ( x , y ) = [ 0 − 1 0 − 1 4 − 1 0 − 1 0 ] P(u,v) 为函数 p(x, y) = \begin {bmatrix}0 & -1 & 0 \\ -1 & 4 & -1 \\ 0 & -1 & 0 \end {bmatrix} P(u,v)p(x,y)=010141010的傅里叶变换

我们认为这个函数是一个拉普拉斯核,注意式中在 γ = 0 \gamma = 0 γ=0时会简化为逆滤波。

函数 P ( u , v ) 和 H ( u , v ) P(u,v)和H(u,v) P(u,v)H(u,v)的大小必须相同。意味着 p ( x , y ) p(x,y) p(x,y)必须嵌入 M M M x N N N 零阵列的中心。为保持 p ( x , y ) p(x,y) p(x,y)的偶对称, M M M N N N必须是偶整数。如果由其获得 H H H的一幅已知退化图像不是偶数维的,则在计算 H H H之前需要酌情删除一行和/或一行,以便可以使用

2021-21-16 update, Thanks to fans id is ‘weixin_42674476’。

def get_puv(image):
    h, w = image.shape[:2]
    
    h_pad, w_pad = h - 3, w - 3
    p_xy = np.array([[0, -1, 0],
                 [-1, 4, -1],
                 [0, -1, 0]])
    p_pad = np.pad(p_xy, ((h_pad//2, h_pad - h_pad//2), (w_pad//2, w_pad - w_pad//2)), mode='constant')
    p_uv = np.fft.fft2(p_pad)
    return p_uv
def least_square_filter(image, PSF, eps, gamma=0.01):
    """
    least square filter for image denoise, math: 
    $$\hat{F}(u,v) = \bigg[\frac{H^*(u,v)}{|H(u,v)|^2 + \gamma |P(u,v)|^2} \bigg]G(u,v)$$
    param: image: input image
    param: PSF: input the PSF mask
    param: eps: epsilon
    param: gamma: gamma value for least square filter fuction
    return image after least square filter
    问题:为什么改变gamma值结果也没有变化,sorted 2021-12-16
    """
    fft = np.fft.fft2(image)
    PSF_fft = np.fft.fft2(PSF)
    conj = PSF_fft.conj()
    p_uv = get_puv(image)
    abs_conj = np.abs(PSF_fft) ** 2
    # abs_conj = (PSF_fft * conj).real
    huv = conj / (abs_conj + gamma * (np.abs(p_uv) ** 2))
    result = np.fft.ifft2(fft * huv)
    result = np.abs(np.fft.fftshift(result))
    return result, abs_conj
# 约束最小二乘方滤波
image = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif", 0)
PSF = get_motion_dsf(image.shape[:2], -50, 100)
blurred = make_blurred(image, PSF, 1e-5)

wiener = wiener_filter(blurred, PSF, 1e-5, K=0.03)     
least_square, abs_con = least_square_filter(blurred, PSF, 1e-5, gamma=1e-6)
least_square = np.uint8(normalize(least_square) * 255)

img_diff = image - least_square
plt.figure(figsize=(15, 5))
plt.subplot(131), plt.imshow(blurred, 'gray'), plt.title("Motion blurred"), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(wiener, 'gray'), plt.title("Wiener Filter"), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(least_square, 'gray'), plt.title("Least Square Filter"), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在这里插入图片描述

几何均值滤波

F ^ ( u , v ) = [ H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 ] α [ H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 + β [ S η ( u , v ) S f ( u , v ) ] ] 1 − α G ( u , v ) (5.99) \hat{F}(u,v) = \bigg[\frac{H^*(u,v)}{|H(u,v)|^2}\bigg]^\alpha \Bigg[\frac{H^*(u,v)}{|H(u,v)|^2 + \beta \big[\frac{S_{\eta}(u,v)}{S_f(u,v)} \big]}\Bigg]^{1-\alpha} G(u, v) \tag{5.99} F^(u,v)=[H(u,v)2H(u,v)]α[H(u,v)2+β[Sf(u,v)Sη(u,v)]H(u,v)]1αG(u,v)(5.99)

α 和 β \alpha 和 \beta αβ 是非负的实常数。

α = 1 \alpha=1 α=1时,几何均值滤波器简化为逆滤波器;当 α = 0 \alpha=0 α=0时,几何均值滤波器变为参数维纳滤波器,参数维纳滤波器在 β = 1 \beta=1 β=1时简化为标准维纳滤波器;当 α = 1 / 2 \alpha=1/2 α=1/2时几何均值滤波器变成幂次相同的两个量的乘积,这就是几何均值的定义。

β = 1 \beta=1 β=1 α \alpha α大于1/2时,滤波器更的性能更像逆滤波器。
α \alpha α 小于1/2时,滤波器的性能更像维纳滤波器。
α \alpha α 等于1/2且 β = 1 \beta=1 β=1时,滤波器通常称为频谱均衡滤波器。

def geometric_mean_filter(image, PSF, eps, K=1, alpha=1, beta=1):
    """
    geometric mean filter for image denoise, math: 
    $$\hat{F}(u,v) = \bigg[\frac{H^*(u,v)}{|H(u,v)|^2}\bigg]^\alpha 
    \Bigg[\frac{H^*(u,v)}{|H(u,v)|^2 + \beta \big[\frac{S_{\eta}(u,v)}{S_f(u,v)} \big]}\Bigg]^{1-\alpha} G(u, v) $$
    param: image: input image
    param: PSF  : input the PSF mask
    param: eps  : epsilon
    param: K    : K equal to math: \frac{S_{\eta}(u,v)}{S_f(u,v)}
    param: alpha: alpha value for filter fuction
    param: beta : beta value for the filter fuction
    return image after least square filter
    """
    fft = np.fft.fft2(image)
    PSF_fft = np.fft.fft2(PSF)
    conj = PSF_fft.conj()
    abs_square = (PSF_fft * conj).real
    huv = np.power(conj / (abs_square), alpha) * np.power(conj / (abs_square + beta*(K)), 1 - alpha)
    result = np.fft.ifft2(fft * huv)
    result = np.abs(np.fft.fftshift(result))
    return result
#### 几何均值滤波器
image = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif", 0)
PSF = get_motion_dsf(image.shape[:2], -50, 100)
blurred = make_blurred(image, PSF, 1e-5)

wiener = wiener_filter(blurred, PSF, 1e-5, K=0.03)     
geometric_mean = geometric_mean_filter(blurred, PSF, 1e-5, K=1, alpha=1/2, beta=0)
geometric_mean = np.uint8(normalize(geometric_mean) * 255)

plt.figure(figsize=(14, 5))
plt.subplot(131), plt.imshow(blurred, 'gray'), plt.title("Motion blurred"), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(wiener, 'gray'), plt.title("Wiener Filter"), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(geometric_mean, 'gray'), plt.title("Geometric mean Filter"), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
最小二乘滤波是一种常用的图像滤波算法,用于去除图像中的噪声并保持边缘信息。在Python中,可以使用NumPyOpenCV库来实现最小二乘滤波。 首先,导入所需的库: ```python import numpy as np import cv2 ``` 接下来,定义一个函数来实现最小二乘滤波: ```python def least_squares_filter(image, kernel_size, lambda_param): # 创建一个与原始图像相同大小的空白图像 filtered_image = np.zeros_like(image) # 遍历图像的每个像素 for i in range(image.shape = weighted_sum / weight_sum return filtered_image ``` 然后,加载图像并调用最小二乘滤波函数: ```python # 加载图像 image = cv2.imread('image.jpg', 0) # 调用最小二乘滤波函数 filtered_image = least_squares_filter(image, kernel_size=3, lambda_param=0.1) # 显示结果图像 cv2.imshow('Filtered Image', filtered_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,`image.jpg`是要进行滤波的图像文件名。`kernel_size`参数表示滤波的邻域大小,`lambda_param`参数用于调整加权最小二乘平均值的权重。 请注意,上述代码只是一个示例,实际使用时可能需要根据具体需求进行调整和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [数字图像处理Python语言实现-图像增强-加权最小二乘滤波(WLS)](https://blog.csdn.net/wujuxKkoolerter/article/details/109827835)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [最小二乘法对图像去噪(python)](https://blog.csdn.net/qq_35831930/article/details/122514362)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jasneik

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值