SMOOTHING (LOWPASS) SPATIAL FILTERS

Gonzalez R. C. and Woods R. E. Digital Image Processing (Forth Edition).

import cv2
import matplotlib.pyplot as plt
import numpy as np

FILTERS

filters实际上就是通过一些特殊的kernel w 对图片进行如下操作:

g(x,y)=s=aat=bbw(s,t)f(x+s,y+t),x=1,2,,M,y=1,2,N.

其中w(s,t)Rm×n,m=2a+1,n=2b+1.
注: 注意到上面会出现f(1,1)之类的未定义情况, 常见的处理方式是在图片周围加padding(分别为pad a, b), 比如补0或者镜像补.

用卷积的目的是其特别的性质:

  1. fg=gf;
  2. f(gh)=(fg)h;
  3. f(g+h)=(fg)+(gh).

注: f,g,h应当形状一致 (或者每次卷积完同样进行padding).

特别的, 如果

w=uvT,

wf=u(vTf).

可以显著降低计算量.

Box Filter Kernels

wij=1mn,i=1,2,,m,j=1,2,,n.

img = cv2.imread("./pics/alphabeta.png")
img.shape
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 由于是截图, 先转成灰度图
plt.imshow(img, cmap='gray')

image-20210614143243637

# 或者等价地用 cv2.blur(img, (m, n))
kernels = [np.ones((i, i)) / (i * i) for i in [3, 11, 21]]
imgs_smoothed = [cv2.filter2D(img, -1, kernel) for kernel in kernels]
fig, axes = plt.subplots(2, 2)
axes[0, 0].imshow(img, cmap='gray')
axes[0, 0].set_title("raw")
axes[0, 1].imshow(imgs_smoothed[0], cmap="gray")
axes[0, 1].set_title("3x3")
axes[1, 0].imshow(imgs_smoothed[1], cmap="gray")
axes[1, 0].set_title("11x11")
axes[1, 1].imshow(imgs_smoothed[2], cmap="gray")
axes[1, 1].set_title("21x21")
plt.tight_layout()
plt.show()

image-20210614143312683

Lowpass Gaussian Filter Kernels

w(s,t)=G(s,t)=Kes2+t22σ2,

高斯分布的特点是绝大部分集中于(3σ,+3σ)之间, 故一般w的大小选择为(6σ,+6σ), 需要注意的是, σ的选择和图片的大小息息相关.

imgs_smoothed = [cv2.GaussianBlur(img, ksize=ksize, sigmaX=sigma) for (ksize, sigma) in [((5, 5), 1), ((21, 21), 3.5), ((43, 43), 7)]]
fig, axes = plt.subplots(1, 4)
axes[0].imshow(img, cmap='gray')
axes[0].set_title("raw")
axes[1].imshow(imgs_smoothed[0], cmap="gray")
axes[1].set_title("5x5, 1")
axes[2].imshow(imgs_smoothed[1], cmap="gray")
axes[2].set_title("21x21, 3.5")
axes[3].imshow(imgs_smoothed[2], cmap="gray")
axes[3].set_title("43x43, 7")
plt.tight_layout()
plt.show()

image-20210614145105794

Order-Statistic (Nonlinear) Filters

g(x,y)(x,y)周围的点的一个某个顺序的值代替, 比如median.

imgs_smoothed = [cv2.medianBlur(img, ksize=ksize) for ksize in [3, 7, 15]]
fig, axes = plt.subplots(1, 4)
axes[0].imshow(img, cmap='gray')
axes[0].set_title("raw")
axes[1].imshow(imgs_smoothed[0], cmap="gray")
axes[1].set_title("3x3")
axes[2].imshow(imgs_smoothed[1], cmap="gray")
axes[2].set_title("7x7")
axes[3].imshow(imgs_smoothed[2], cmap="gray")
axes[3].set_title("15x15")
plt.tight_layout()
plt.show()

image-20210614145546864

posted @   馒头and花卷  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示