用Python在图像上应用高斯滤波器

用Python在图像上应用高斯滤波器

高斯滤波器是一个低通滤波器,用于降低噪音(高频成分)和模糊图像区域。该滤波器是作为一个奇数大小的对称核(矩阵的DIP版本)来实现的,它通过感兴趣区域的每个像素来获得所需的效果。该核对颜色的急剧变化(边缘)并不困难,因为核中心的像素比外围的像素拥有更多的权重,从而获得最终的数值。高斯滤波器可以被认为是高斯函数的一种近似值(数学)。在这篇文章中,我们将学习使用Python编程语言,利用高斯滤波器来减少图像中的噪音。

我们将使用以下图片进行演示。

用Python在图像上应用高斯滤波器

Windows explorer的一个片段的截图

应用高斯滤波器的过程

在对图像使用高斯滤波的过程中,我们首先要定义用于去除图像的内核/矩阵的大小。这些尺寸通常是奇数,也就是说,整体结果可以在中心像素上计算出来。此外,内核是对称的,因此有相同数量的行和列。核内的数值是由高斯函数计算出来的,如下所示。

用Python在图像上应用高斯滤波器

2维高斯函数

其中,

x → X坐标值

y → Y坐标值

σ → 标准偏差

使用上述函数可以计算出任何大小的高斯核,只要给它提供适当的值。一个标准偏差=1的3×3高斯核近似值(二维),显示如下

用Python在图像上应用高斯滤波器

在Python中实现高斯核

我们将使用PIL(Python Imaging Library)中名为filter()的函数,将我们的整个图像通过预定义的高斯核。该函数的帮助页面如下。

语法: Filter(Kernel)

摄取一个内核(预定义或自定义),并通过它摄取图像的每个像素(内核卷积)。

参数: Filter Kernel

返回: Image Object

在下面的例子中,我们将对上述图像进行模糊处理。

# ImageFilter for using filter() function
from PIL import Image, ImageFilter
  
# Opening the image 
# (R prefixed to string in order to deal with '\' in paths)
image = Image.open(r"IMAGE_PATH")
  
# Blurring image by sending the ImageFilter.
# GaussianBlur predefined kernel argument
image = image.filter(ImageFilter.GaussianBlur)
  
# Displaying the image
image.show()

输出:

用Python在图像上应用高斯滤波器

Blurred Image

解释:

首先,我们导入了PIL库的Image和ImageFilter(用于使用filter())模块。然后我们通过在IMAGE_PATH(用户定义)的路径上打开图像来创建一个图像对象。之后,我们通过过滤器函数过滤图像,并提供ImageFilter.GaussianBlur(ImageFilter模块中预定义的)作为参数。ImageFilter.GaussianBlur的内核尺寸是5×5。最后我们显示了图像。

注意:内核的大小可以通过传递内核的半径作为参数(可选)来进行操作。这就改变了下面这一行的内容。

image = image.filter(ImageFilter.GaussianBlur)

to

image = image.filter(ImageFilter.GaussianBlur(radius=x))

其中x => 模糊半径(从中心像素开始的一个方向的内核大小)。

模糊图像中的一个小区域

可以不对整个图像进行模糊处理,而是对其中的某些部分进行选择性的模糊处理。这可以通过首先裁剪图像中需要的区域,然后通过filter()函数来完成。该函数的输出(模糊的子图像)将被粘贴到原始图像上。这将给我们带来理想的输出。

其代码如下:

from PIL import Image, ImageFilter
  
image = Image.open(r"FILE_PATH")
  
# Cropping the image 
smol_image = image.crop((0, 0, 150, 150))
  
# Blurring on the cropped image
blurred_image = smol_image.filter(ImageFilter.GaussianBlur)
  
# Pasting the blurred image on the original image
image.paste(blurred_image, (0,0))
  
# Displaying the image
image.save('output.png')

输出:

用Python在图像上应用高斯滤波器

只有图像的左上角区域是模糊的

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python pil