使用高斯滤波器实现抗锯齿下采样

843 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

前言

为了减少图像的尺寸大小,我们需要对图像执行下样本。得到的尺寸较小的新图像中的每个像素对应于原始大图像中的多个像素。直接从原始图像中删除像素有助于减少图像的分辨率,但是它会引入空间混叠效应(例如摩尔纹),并且导致输出图像质量较差。为了防止这种情况,需要使用抗混叠滤波器(在下采样之前)以过滤图像高频分量。

使用高斯滤波器实现抗锯齿下采样

在本节中,我们将学习一种简单的抗锯齿技术,该方法通过在下采样前应用低通滤波器( LPF )来实现。

(1) 导入所需的库,读取输入图像并将其转换为 float 类型(使所有像素值均在 01 之间),我们的目标是通过将高度和宽度减少三倍,将图像大小减少九倍:

from skimage.filters import gaussian
from skimage import img_as_float
import numpy as np
from skimage.io import imread
import matplotlib.pyplot as plt

im = img_as_float(imread('1.png'))
print(im.shape)

  (2) 在下采样之前,应用高斯滤波器作为预处理步骤,以使图像更加平滑。使用 skimage.filters.gaussian() 函数将高斯模糊应用于图像,等价的,我们也可以使用 scipy.ndimage.gaussian_filter() 函数:

im_blurred = gaussian(im, sigma=1.25, multichannel=True)

(3) 从原始图像中在 XY 轴方向的每隔三个像素保留一个像素,以获取尺寸较小的图像。观察没有使用高斯滤波器(带有空间混叠)通过下采样获得的输出图像的质量:

n = 3 # 缩放图像倍数
h, w = im.shape[0] // n, im.shape[1] // n
im_small = np.zeros((h, w, 3))
for i in range(h):
   for j in range(w):
      im_small[i,j] = im[n*i, n*j]
im_small_aa = np.zeros((h, w, 3))
for i in range(h):
   for j in range(w):
      im_small_aa[i,j] = im_blurred[n*i, n*j]

(4) 绘制原始输入图像:

plt.figure(figsize=(15,15))
plt.imshow(im), plt.title('Original Image', size=10)
plt.show()

Figure_4.png

(5) 绘制没有使用高斯滤波器进行下采样的图像:

plt.figure(figsize=(15,15))
plt.imshow(im_small), plt.title('Resized Image (without Anti-aliasing)', size=10)
plt.show()

Figure_5.png

(6) 绘制使用抗锯齿技术得到的下采样图像:

plt.figure(figsize=(15,15))
plt.imshow(im_small_aa), plt.title('Resized Image (with Anti-aliasing)', size=10)
plt.show()

Figure_6.png

正如上图所示,没有抗锯齿的下采样图像中存在空间混叠现象,但是具有抗锯齿操作的图像中几乎不存在这种现象。由于高斯模糊是 LPF,因此从原始输入图像中移除了高频部分。因此,可以避免空间混叠现象。