2013-09-24 50 views
6

我不明白一个人如何能拿出称为内核简单的3x3矩阵,所以当应用到图像,它会产生一些真棒效果。示例:http://en.wikipedia.org/wiki/Kernel_(image_processing)。它为什么有效?人们如何提出这些内核(试验和错误?)?是否有可能证明它将始终适用于所有图像?为什么与内核卷积工作?

+0

这似乎更像是一个数学问题,而不是一个编程问题。您可能会在math.stackexchange.com获得更多的关注。 – templatetypedef

+2

也许这应该留在这里,因为卷积核可以被认为是编程模式/工具。数学家可能不会用正确的术语描述这个想法。 – Potatoswatter

+0

我同意Potatoswatter;熟悉这些概念的人倾向于描述数学,但不能解释它 - 这听起来像海报更喜欢直观的手挥动的解释比公式? – Tommy

回答

7

直观,图像我和一个核K的卷积产生真实通过计算加权和,每个像素由权重加权K.即使你没有所有邻近像素形成的新形象知道卷积是什么,这个想法似乎仍然很合理。你可以用它来做一个模糊效果(通过使用附近像素的高斯加权)或锐化边缘(通过从邻居中减去每个像素并在其他地方不加重)。事实上,如果你知道你需要做所有的事情这些操作,尝试编写一个函数是有意义的,因为给定I和K做了附近像素的加权和,并尝试尽可能积极地优化该函数(因为您可能会使用它)。

从那里得到的卷积的想法,你可能必须傅立叶变换和傅立叶级数的背景。卷积在该领域是一个完全自然的想法 - 如果计算两幅图像的傅立叶变换并将变换乘以一起​​,则最终计算卷积的变换。数学家干过说出来了一段时间后,可能通过回答很自然的问题:“什么功能傅立叶变换由另两个傅立叶变换的产品定义?”,并从那里被发现在连接之前,这只是一个时间问题。由于傅立叶变换已被广泛用于计算(例如,在网络中的信号处理中),我的猜测是,具有傅里叶级数背景的人发现他们需要将K应用于图像I,然后认识到这是在频率空间中完成时更容易且计算更有效率。

老实说,我不知道真实的历史是什么,但是这是一个非常合理的解释。

希望这会有所帮助!

7

有关于卷积数学理论的一个很好的协议,但您链接到内核的例子是简单直观地解释:

[ 0 0 0] 
[ 0 1 0] 
[ 0 0 0] 

这一个说把原来的像素,没有别的,所以它产生只是原始图像。

[-1 -1 -1] 
[-1 8 -1] 
[-1 -1 -1] 

这个说从8倍的原始像素减去8个邻居。首先考虑在图像的光滑部分发生什么,其中有坚实的,不变的颜色。原始像素的八倍等于八个相同邻居的总和,所以差值为零。因此,图像的平滑部分变黑。但是,有变化的部分图像不会变黑。因此,此内核突出显示更改,因此它会突出显示一个形状结束而另一个形状结束的地方:图像中对象的边缘。

[ 0 1 0] 
[ 1 -4 1] 
[ 0 1 0] 

这与上面的类似,但调整方式不同。

[ 0 -1 0] 
[-1 5 -1] 
[0 -1 0] 

观察到,这只是上面的边缘检测器的否定加上我们看到的第一个滤波器,即原始图像。所以这个内核都会突出显示边缘并将其添加到原始图像中。结果是具有更多可见边缘的原始图像:锐化效果。

[ 1 2 1] 
[ 2 4 2] 
[ 1 2 1] 

[ 1 1 1] 
[ 1 1 1] 
[ 1 1 1] 

这两者都将原始像素与其邻居混合。所以他们模糊了一些图像。

5

有两种思考(或编码)图像的方式:空间域和频率域。空间表示是基于像素的,因此它更加熟悉并且更容易获得。图像和内核都在空间域中表示。

要进入频域,您需要使用傅里叶或相关变换,这在计算上很昂贵。然而,一旦你在那里,许多有趣的操作更简单。要对图像进行模糊处理,只需切掉一些高频部分 - 例如在空间域中裁剪图像。锐化是相反的,类似于增加高频信息的对比度。

图像的大部分信息都处于高频,表示细节。大部分有趣的细节信息都是在当地规模上很小的。您可以通过查看相邻像素来做很多事情。模糊基本上是取相邻像素的加权平均值。锐化包括查看像素与其邻居之间的差异并增强对比度。

核通常是通过进行频域变换,然后只保留高频部分并在空间域中表示它来产生的。这只能用于某些转换算法。你可以计算模糊,锐化,选择某些种类的线等的理想内核,它会直观地工作,但否则看起来像魔术,因为我们没有真正的“像素算术”。

一旦你拥有一个内核,当然,根本没有必要进入频域。这项艰巨的工作在概念和计算上完成。卷积对所有参与者都非常友好,并且您很少可以进一步简化。当然,更小的内核更友好。有时一个大的内核可以表示为小的子内核的卷积,这是数学和软件感官的一种因素。

数学过程非常简单,并且早在计算机出现之前就已经进行了研究。最常见的操作可以在使用18世纪设备的光学工作台上机械地完成。

2

我认为解释它们的最好方法是从1d开始讨论z-transform及其逆。从时域切换到频域 - 将波描述为采样的定时序列,并将其描述为对其有贡献的每个频率的幅度。这两种表示包含相同数量的信息,他们只是用不同的方式表达。

现在假设您在频域中描述了一个波,并且您想对其应用滤波器。您可能想要移除高频率。这将是一个模糊。您可能想要移除低频率。这将是一个锐化,或在极端情况下,边缘检测。

你可以通过强制你不想要的频率0 - 例如通过将整个范围乘以特定掩码,其中1是您想要保留的频率,0是您想要消除的频率。

但是如果你想在时域中做到这一点呢?您可以转换到频域,应用蒙版,然后转换回来。但这是很多工作。所以你做的(近似)是将掩模从频域变换到时域。然后可以在时域中应用它。

根据涉及来回变换的数学原理,理论上来说,您必须使每个输出样本都是每个输入样本的加权和。在现实世界中,你需要权衡。例如,您可以使用9个样本的总和。与使用99个样本相比,这样可以缩短延迟并减少处理成本。但它也给你一个不太准确的过滤器。

图形内核是该思路的二维模拟。它们往往很小,因为加工成本随着边缘长度的平方增长,所以它变得非常快。但是您可以近似任何类型的频域限幅滤波器。

9

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

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

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

您可以了解在教科书计算机视觉巴拉德和布朗数学卷积。这本书可以追溯到80年代初,但它仍然是相当有用的,你可以看到它是免费的在线:

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

从目录到巴拉德和布朗的书,你会发现一个链接以PDF格式为2.2.4空间属性。

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

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

您会注意到许多内核/操作符与名称相关联:Sobel,Prewitt,Laplacian,Gaussian等。这些名称有助于表明,有一段历史 - 实际上历史悠久 - 数学发展和图像处理研究已经导致了今天常见的大量内核。

高斯和拉普拉斯在我们面前很久就生活过,但他们的数学工作已经渗透到我们可以在图像处理中使用的形式中。他们没有在内核上进行图像处理,但他们开发的数学技术可直接应用于图像处理,并且通常用于图像处理。其他内核专为处理图像而开发。

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

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

为什么它的工作?

阅读关于卷积的数学理论,了解一个函数可以如何“跨越”或“拖曳”跨越另一个函数。这可以解释理论基础。

然后就是个别内核工作原因的问题。在您查看图像中从黑暗到光线的边缘过渡时,如果您在二维散点图上绘制像素亮度,则您会注意到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矩阵中的一堆数字的方式。但没关系!如果你对普通内核的一般意义是有用的,并且如果你观察到两个类似的内核如何产生稍微不同的结果,那么你会对它们产生良好的感觉。