《计算机视觉算法:基于OpenCV的计算机应用开发》 —3.4 矩阵和数组级操作
3.4 矩阵和数组级操作
与我们在本章中迄今为止看到的函数和算法不同,本节中的算法对图像(或矩阵)本身执行原子和整体操作,即不再以元素为单位进行操作了。回忆我们前面学过的,元素操作的经验法则是它们可以很容易地并行化,因为得到的矩阵依赖于两个图像的对应像素,而我们将要学习的函数和算法不容易并行化,因为得到的像素和值可能与它们对应的源像素几乎没有或完全没有关系,或者完全相反,结果像素可能同时依赖于部分或全部输入像素。
3.4.1 为外推法生成边界
正如你将在本章和后续章节中看到的,许多计算机视觉算法要处理的最重要问题之一是外推,简单来说,就是假设图像外部也存在像素。你可能会想,为什么要考虑不存在的像素?最简单的回答是,有许多计算机视觉算法不仅仅处理单个像素,还要处理每个像素周围的其他像素。在这种情况下,当像素位于图像的中间时,没有问题。但是对于图像边界处的像素(例如,在最上面一行),一些周围像素将落在图像之外。这正是你需要考虑外推和假设图像外部仍存在像素的原因。那么你是否简单地假设这些像素的值都为零?或许假设它们与边界像素具有相同的值更好一些?这些问题都在名为copyMakeBorder的OpenCV函数中进行处理。
copyMakeBorder函数允许我们在图像外部形成边框,并提供足够的自定义选项来处理所有可能的场景。让我们用几个简单的例子来看看copyMakeBorder函数的用法:
如前面的示例所示,copyMakeBorder接受输入图像并生成结果图像,就像我们迄今为止学到的大多数OpenCV函数一样。此外,此函数必须传入四个整数值,表示添加到图像顶部(top)、底部(bottom)、左侧(left)和右侧(right)的像素个数。但是,这里最重要的参数是border类型参数,该参数必须是BorderTypes枚举类型的元素之一。以下是部分常用的BorderType值:
请注意,当BORDER_CONSTANT用作边框类型参数时,必须为copyMakeBorder函数提供额外的标量参数来表示创建的边框的常量颜色值。如果省略该值,则假定该值为零(或黑色)。下图演示了copyMakeBorder函数在我们的示例图像上执行时的输出:
copyMakeBorder和许多其他OpenCV函数在内部使用borderInterpolate函数来计算外推的像素位置并创建不存在的像素。你不需要自己直接调用此函数,因此我们将其留给读者自行探索。
- 点赞
- 收藏
- 关注作者
评论(0)