图像处理:均值和中值滤波器。

图像处理:均值和中值滤波器。

在本文中,我描述了两种类型的过滤器,并显示代码是我自己编写的。主要目标是实现我自己的过滤器,不要使用流行的库。我将尝试解释它是如何工作的,并向您展示过滤器如何减少图像中的噪声。

内容

  • 什么是过滤器?
  • 过滤器类型
  • 过滤器比较
  • 均值过滤器
    一个。过滤器是如何工作的?
    湾。代码植入
  • 中值滤波器
    一个。过滤器是如何工作的?
    湾。代码植入
    C。测试

什么是过滤器?

所有过滤器的主要使用目标是修改图像或从图片中提取有价值的信息。过滤器的一些示例如下:

  • 降噪
  • 模糊
  • 边缘检测
  • 锐化细节
  • 对比度增强

简而言之,过滤器就是这样一个函数,它使用一个特殊的方形数组来操作像素值,称为 核心。 内核的形状或内部的值定义了操作的类型,例如模糊或降噪。换句话说,过滤器只是获取原始图像并通过像素操作形成新图像。

过滤器类型

有两组滤波器:线性和非线性。通过线性滤波器,结果由围绕一个像素的所有邻域值的线性组合定义。后面会有解释。对于这种类型的滤波器,请处理平均滤波器。此外,一个名为 卷积

通过非线性滤波器,结果不能由卷积定义。这些是更复杂的算法,但它们是不可或缺的。中值滤波器就是这种类型。

过滤器比较

让我们比较这两个过滤器。我用 盐和胡椒 噪音。这种噪音不同于习惯于看到的噪音。如您所见,中值滤波器比均值滤波器处理得更好,因为均值滤波器只是对图像进行平滑处理,换句话说,混合了像素值和噪声,相比之下,中值滤波器减少了噪声像素。在某些情况下,非线性滤波器(中值)是比线性滤波器(均值)更好的选择

fig.1. Comparing the two filters.

均值过滤器

它是如何工作的?

正如我之前所说,特殊内核用于形成过滤后的图像。均值滤波器也不例外。这个过滤器的主要思想隐藏在他的名字中。对于过滤,我们应该找到所有数字都在内核下的平均值。

考虑典型的平均核——是一个 3x3 矩阵(图 2)。值得强调:所有数字的总和必须等于 1 图像中信息的不变性。

fig.2. The mean kernel for smoothing images.

乘以图像数组的 3x3 部分,然后将所有值相加,我们得到这组像素的平均值。对输入图像中的每个像素重复该过程。 (图 3。)因此,新的像素值会创建新的图像。

现在我们可以编写代码了。开始了!

代码

我将从库的导入开始。 Pyplot 用于显示图形。 OpenCV 仅用于从内存中上传图像并保存输出图像。我将通过 NumPy 库创建数组。

我需要下载只有一个通道的图像才能获得灰度图像。注意:您也可以使用标志 cv2.IMREAD_GRAYSCALE 代替 0 将图像从彩色转换为内部的黑白格式 cv2.imread() 功能。

接下来,我通过下面的函数创建椒盐噪声。关于这种类型的噪音,你可以阅读这个 https://en.wikipedia.org/wiki/Salt-and-pepper_noise .可以为随机像素分配以下两个值之一:0 或 255。

我使用平均内核进行图像平滑。这只是一个平方,但必须消除较少的信息,因此内核的总和必须等于 1。我们也可以将其解释为平均值。

所以,现在我们可以编写过滤器的核心了。首先,我需要定义移动内核的迭代次数(步数)。这个数字取决于内核大小和图像的大小。迭代次数必须大于 0,因为图像大小必须大于内核大小。

注意:在每次迭代中,我取一定数量的由内核大小确定的像素值,并使用函数乘以内核 平均值 .我已经在一个单独的代码窗口中编译了这个函数证据。

此函数获取输入两个数组,因此将每个值与内核值相乘。注意:如您所见,我们找到了数组的平均值,但我们不使用除以元素的数量,因为您的内核已经有了这个除法。

就是这样,现在我们可以通过实现一个简单的函数来查看结果。我记得,你可以在图 1 中看到这个结果。

中值滤波器

它是如何工作的?

我可以用一句话来描述这个过滤器的工作:中值过滤器找到内核区域下所有像素的中值,并将中心元素替换为这个中值。让我们一步一步地看这个过程,以便更清楚地理解。首先,我们取一定数量的像素,例如 3x3。

既然我们有一个数组,我们应该把它变成 列表 .

接下来,让我们对这个列表进行排序,最终找到一个中值。

结果,我们得到了输出图像的新像素值(图 3)。

fig.3. Filtered image by the median filter.

代码

首先,我们应该和前面的代码做完全一样的步骤:导入库,读取图像,实现手工制作的功能 盐和胡椒 噪音

正如在“它是如何工作的”部分中所写的,整个过程有几个步骤:

  1. 从图像中取 9 个值(对于 3x3 内核矩阵)
  2. 将此矩阵转换为 列表
  3. 实现排序功能
  4. 求中值
  5. 将值写入结果矩阵

现在我们可以开始一步一步地编写代码了。第一步将在主函数中 中值过滤器 ,因此我们从第二步开始,为矩阵转换为列表编写一个矩阵。

接下来,我最喜欢的部分是排序功能。您可以使用内置函数进行排序,但我想编写自己的代码。我不会解释它究竟是如何工作的,但要强调:在每次迭代中,我找到最小值,从输入数组中删除这个值并将其附加到结果数组中,然后用一个没有最小值的新输入数组执行这个函数。

对值进行排序后,下一步是找到中值。它非常易于理解,并且仅基于数学规则。

这个函数的处理与 mean_function 但只有循环中的部分代码不同。笔记: 内核大小 仅确定内核大小,其中“3”表示 3x3 矩阵。

现在我们可以展示函数实现的结果。你怎么看,它好多了,不是吗?

测试

在代码实现的定义时间内,我用不同的图像和不同的噪声值测试了几个测试。现在,会有很多数字,等等!

平均过滤过程约为 83033 每秒像素。常见的 1920x1080 像素 .图像将在大约 25 秒

注意:图像大小对滤波过程的影响大于噪声量。

结论

我们已经了解了过滤器的工作原理。我希望你能找到新的东西!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/23556/26481001

posted @ 2022-09-10 01:27  哈哈哈来了啊啊啊  阅读(428)  评论(0编辑  收藏  举报