如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊?

2024-03-12

我想使用原生高斯模糊公式来模糊图像。我读维基百科文章 http://en.wikipedia.org/wiki/Gaussian_blur,但我不确定如何实现这一点。

如何使用公式来确定权重?

我不想使用 MATLAB 等内置函数


编写朴素的高斯模糊实际上非常简单。它的完成方式与任何其他卷积滤波器完全相同。盒子和高斯滤波器之间的唯一区别是您使用的矩阵。

假设您有一个定义如下的图像:

 0  1  2  3  4  5  6  7  8  9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99

3x3 盒式滤波器矩阵定义如下:

0.111 0.111 0.111
0.111 0.111 0.111
0.111 0.111 0.111

要应用高斯模糊,您需要执行以下操作:

对于像素 11,您需要加载像素 0、1、2、10、11、12、20、21、22。

然后将像素 0 乘以 3x3 模糊滤镜的左上部分。像素 1 在顶部中间,像素 2,像素 3 在右上角,像素 10 在中间左侧,依此类推。

然后将它们相加并将结果写入像素 11。如您所见,像素 11 现在是其自身和周围像素的平均值。

边缘情况确实会变得更复杂一些。您使用什么值作为纹理边缘的值?一种方法是绕到另一侧。这对于稍后平铺的图像来说看起来不错。另一种方法是将像素推入周围的位置。

因此,对于左上角,您可以按如下方式放置示例:

 0  0  1
 0  0  1
10 10 11

我希望您能看到如何轻松地将其扩展到大型过滤器内核(即 5x5 或 9x9 等)。

高斯滤波器和盒式滤波器之间的区别在于矩阵中的数字。高斯滤波器在行和列上使用高斯分布。

例如,对于任意定义的过滤器(即这不是高斯分布,但可能相差不远)

0.1 0.8 0.1

第一列将相同,但乘以上面行的第一项。

0.01 0.8 0.1
0.08 
0.01 

第二列将相同,但值将乘以上面行中的 0.8(依此类推)。

0.01 0.08 0.01
0.08 0.64 0.08
0.01 0.08 0.01

将上述所有内容相加的结果应等于 1。上述滤波器与原始盒式滤波器之间的区别在于,写入的结束像素对中心像素(即位于该位置的像素)具有更重的权重已经)。之所以会出现模糊,是因为周围的像素确实模糊到了该像素中,尽管程度没有那么模糊。使用这种滤镜,您会得到一种模糊效果,但不会破坏尽可能多的高频(即颜色从一个像素到另一个像素的快速变化)信息。

这些类型的过滤器可以做很多有趣的事情。您可以使用此类过滤器通过从当前像素中减去周围像素来进行边缘检测。这只会留下真正大的颜色变化(高频)。

编辑:5x5 过滤器内核的定义与上面完全相同。

例如,如果您的行是 0.1 0.2 0.4 0.2 0.1 那么如果您将其中的每个值乘以第一项以形成一列,然后将每个值乘以第二项以形成第二列,依此类推,您最终将得到一个过滤器的

0.01 0.02 0.04 0.02 0.01
0.02 0.04 0.08 0.04 0.02
0.04 0.08 0.16 0.08 0.04
0.02 0.04 0.08 0.04 0.02
0.01 0.02 0.04 0.02 0.01

取任意位置,您可以看到位置 0, 0 就是简单的 0.1 * 0.1。位置 0、2 为 0.1 * 0.4,位置 2、2 为 0.4 * 0.4,位置 1、2 为 0.2 * 0.4。

我希望这能给你一个足够好的解释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊? 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐