c - 为什么与内核卷积有效?

标签 c image math image-processing convolution

我不明白有人怎么会想出一个简单的 3x3 矩阵,称为内核,所以当应用于图像时,它会产生一些很棒的效果。示例:http://en.wikipedia.org/wiki/Kernel_(image_processing) .为什么有效?人们是如何想出这些内核的(反复试验?)?是否有可能证明它始终适用于所有图像?

最佳答案

我不明白有人怎么会想出一个简单的 3x3 矩阵,称为内核,所以当应用于图像时,它会产生一些很棒的效果。示例:http://en.wikipedia.org/wiki/Kernel_(image_processing) .

如果您想深入了解历史,则需要查看其他一些术语。在较早的图像处理教科书中,我们今天认为的内核更可能被称为“ 运算符 ”。另一个关键术语是 卷积 .这两个术语都暗示了内核的数学基础。

http://en.wikipedia.org/wiki/Convolution

您可以在 Ballard 和 Brown 的教科书《计算机视觉》中了解数学卷积。这本书可以追溯到 80 年代初,但它仍然很有用,您可以在线免费阅读:

http://homepages.inf.ed.ac.uk/rbf/BOOKS/BANDB/toc.htm

从目录到 Ballard and Brown 的书,您会找到指向第 2.2.4 节空间属性的 PDF 的链接。

http://homepages.inf.ed.ac.uk/rbf/BOOKS/BANDB/LIB/bandb2_2.pdf

在 PDF 中,向下滚动到“卷积定理”部分。这为卷积提供了数学背景。从考虑表示为函数和积分的卷积到将相同原理应用于二维图像中灰度(或颜色)数据的离散世界,这是一个相对较短的步骤。

您会注意到许多内核/运算符与名称相关联:Sobel、Prewitt、Laplacian、Gaussian 等等。这些名称有助于表明数学发展和图像处理研究的历史 - 确实相当长的历史 - 导致了今天普遍使用的大量内核。

高斯和拉普拉斯早在我们之前,但他们的数学工作已经渗透到我们可以在图像处理中使用的形式。他们没有研究用于图像处理的内核,但他们开发的数学技术可直接应用于图像处理并普遍使用。其他内核是专门为处理图像而开发的。

如果维基百科是正确的,Prewitt 算子(内核)与 Sobel 算子非常相似,发表于 1970 年。

http://en.wikipedia.org/wiki/Prewitt_operator

为什么有效?

阅读卷积的数学理论,了解一个函数如何“传递”或“拖拽”到另一个函数上。那可以解释理论基础。

然后是为什么单个内核工作的问题。在您查看图像中从暗到亮的边缘过渡时,如果您在 2D 散点图上绘制像素亮度,您会注意到 Y 轴上的值围绕图像中的边缘过渡快速增加。该边缘过渡是一个斜坡。可以使用一阶导数找到斜率。多田!近似一阶导数算子的内核将找到边。

如果您知道光学中有诸如高斯模糊之类的东西,那么您可能想知道如何将其应用于 2D 图像。由此推导出高斯核。

例如,拉普拉斯算子是一个算子,根据维基百科条目的第一句话,“是一个微分算子,由欧几里德空间上的函数梯度的散度给出。”

http://en.wikipedia.org/wiki/Laplacian

呵呵小子。从这个定义到内核是一个很大的飞跃。下一页很好地解释了导数和内核之间的关系,这是一个快速阅读:

http://www.aishack.in/2011/04/the-sobel-and-laplacian-edge-detectors/

您还将看到,在您引用的维基百科条目中,拉普拉斯核的一种形式被简单地命名为“寻边”核。

有不止一个寻边内核,每个内核都有自己的位置。 Laplacian、Sobel、Prewitt、Kirsch 和 Roberts 核都产生不同的结果,并且适用于不同的目的。

人们是如何想出这些内核的(反复试验?)?

内核是由不同的人按照不同的研究路径开发的。

一些内核(在我的内存中)是专门为模拟“早期视觉”过程而开发的。早期视觉不仅仅发生在早期人类身上,或者只发生在凌晨 4 点起床的人身上,而是指生物视觉的低级过程:对基本颜色、强度、边缘等的感知。在非常低的层次上,生物视觉中的边缘检测可以用内核建模。

其他内核,例如拉普拉斯和高斯,是数学函数的近似值。只需稍加努力,您就可以自己推导出内核。

图像编辑和图像处理软件包通常允许您定义自己的内核。例如,如果您想在图像中识别一个小到可以由几个连接像素定义的形状,那么您可以定义一个与您要检测的图像特征的形状相匹配的内核。使用自定义内核来检测对象太粗糙,无法在大多数实际应用程序中工作,但有时有理由为非常特定的目的创建特殊内核,有时需要进行一些试验和错误才能找到一个好的内核。

正如用户 templatetypedef 指出的那样,您可以直观地考虑内核,并在相当短的时间内对每个内核的作用产生一种感觉。

是否有可能证明它始终适用于所有图像?

从功能上讲,您可以将 3x3、5x5 或 NxN 内核扔到适当大小的图像上,并且它会“工作”,因为操作将被执行并且会有一些结果。但是,计算结果是否有用的能力并不是“有效”的一个很好的定义。

内核是否“有效”的一个信息定义是将图像与该内核卷积是否会产生您认为有用的结果。如果您在 Photoshop 或 GIMP 中处理图像,并且发现特定的增强内核不能产生您想要的效果,那么您可能会说该内核在您的特定图像和最终结果的上下文中不起作用你要。在计算机视觉的图像处理中存在类似的问题:我们必须选择一个或多个内核和其他(通常是非基于内核的)算法,它们将按顺序运行以执行一些有用的操作,例如识别人脸、测量汽车的速度或引导装配任务中的机器人。

作业

如果您想了解如何将数学概念转化为内核,那么您自己推导出内核会有所帮助。即使您知道推导的最终结果应该是什么,为了理解内核和卷积的概念,您自己、在纸上和(最好)从内存中从数学函数中推导出内核是有帮助的。

尝试从数学函数推导出 3x3 高斯核。

http://en.wikipedia.org/wiki/Gaussian_function

自己推导内核,或者至少找到一个在线教程并仔细阅读,将会很有启发性。如果您不想做这项工作,那么您可能不会欣赏某些数学表达式“转换”为 3x3 矩阵中的一堆数字的方式。不过没关系!如果您对通用内核很有用,并且观察到两个相似的内核如何产生略有不同的结果,那么您就会对它们产生良好的感觉。

关于c - 为什么与内核卷积有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18970864/

相关文章:

C函数只调用一次和圈复杂度

android - 在 Android NDK 中使用 -fsigned-char 构建是否安全?

ios - 在 Swift 中将 UIImage 转换为 UInt8 数组

javascript - 旋转后如何排列元素

opengl - 在 OpenGL 中沿折线路径创建管

css - less css 中某个值的百分比

c - 与字符串函数相关的代码优化

c++ - Windows 的 Bignum 库?

javascript - 在 jQuery/javascript 中从头编写图像裁剪器和缩放器(同时)?

html - 如何通过将鼠标悬停在另一个 div 图像上来将 div 图像更改为另一个图像?