vImage学习笔记——卷积(Convolution)
卷积(Convolution)是一个常用的图像处理技术,可以改变像素强度,从而影响周围其他像素的强度。卷积的常用技术是创建滤镜,使用卷积技术,你可以获取一些流行的图像效果,比如模糊(blur)、锐化(sharpen)及边缘检测(edge detection),这些效果在Photo Booth、iPhoto和Aperture都有广泛使用。
如果你对图像滤镜和实时处理有兴趣的话,你会发现vImage函数集的好处。用图像滤镜,卷积操作可以完成一些常用的滤镜效果,比如浮雕、模糊及色调分离。
vImage卷积技术对锐化或增强图像质量也很有用。当处理一些科学图像时,增强图像质量很有用。此外,由于科学图像通常都很大,就很有必要使用这些vImage技术来达到合适的性能需求。这种情况下你需要用到的技术有边缘检测(edge detection)、锐化、描绘外观轮廓(surface contour outlining)、平滑、及动作检测(motion detection)。
本章节讲述了卷积技术,以及如何使用vImage提供的卷积函数。通过本文,你可以:
了解卷积技术可以实现哪些效果;
学习什么是卷积核以及如何构建卷积核;
通过代码示例,学习如何对一个图像使用卷积技术。
卷积核(Convolution Kernels)
图1展示了一个图像通过vImage卷积函数添加了浮雕效果前后的对比图。为了达到这个效果,vImage使用一个类网格的数学概念,称为核(kernel),来完成卷积操作。
图1 浮雕
图1 浮雕
图2是一个3×3的kernel。kernel的高度和宽度不必一样,但必须是奇数。kernel内部的数值会影响卷积的整体效果。这些数值决定了初始图像像素会如何转换成目标图像像素,这看起来可能不是很直观,9个数字会如何影响到滤镜效果呢?卷积技术经过一系列的操作,根据周围像素的强度改变当前像素的强度。vImage根据kernel执行卷积操作,这种通过kernel执行卷积计算的过程就称为kernel convolution(核卷积)。
图2 3×3卷积
卷积是像素单位的操作,即对每个像素都要执行同样的算法。因此,大图像比小图像需要更多的卷积操作。一个kernel可以被看做一个二维的网格数据,而图像也可以被看做一个二维网格数据(如图3),对一个图像应用kernel可以想象成把一个小格子(kernel)平铺在大格子(图像)上。
图3 图像是二维网格数据
kernel内部的数值会作为与它下面的数值相乘的乘数,下面的数值指的是被kernel数值覆盖的像素的强度。在进行卷积计算时,把kernel的中心值覆盖在待转换的像素上,然后将kernel的每个值与其正下方的像素值相乘,最后将所有的结果相加,相加后的结果就是新的像素强度。图4展示了kernel是如何转化像素的。
图4 核卷积