龙空技术网

OpenCV 1.3 矩阵的掩膜操作

陈之炎 257

前言:

现时兄弟们对“assert c语言报错”可能比较珍视,看官们都想要剖析一些“assert c语言报错”的相关内容。那么小编也在网摘上网罗了一些关于“assert c语言报错””的相关知识,希望朋友们能喜欢,同学们一起来了解一下吧!

矩阵的掩膜操作(mask)并不难。主要思路为:根据掩膜矩阵(也称为内核kernel)重新计算图像中每个像素的值。利用掩膜矩阵调整相邻像素对当前像素值的影响。从数学的角度来看,即是利用特定的权重值,对像素做一个加权平均。

测试案例

来看一下如何增强图像对比度的示例,按照以下公式重新计算图像各个像素:

第一种是利用公式做计算,而第二种是第一种使用mask来计算的简化版本。需要计算的像素对准掩膜矩阵的中心,将像素值和掩膜矩阵的值相加后求和。对于较大的图像来说,操作也是相同,后者的表述更容易被理解。

代码

可以到这里下载源代码,或者到以下目录中查看OpenCV的源代码示例库。

基本方法

接下来看下,如何通过两种方法来实现上述功能。一是使用获取像素值的基本方法,另一个是使用filter2D函数。

该函数的功能如下:

首先,应确保输入图像的数据类型是无符号的字符格式(unsigned char),当内部表达发生错误时,使用 cv::CV_Assert函数来报错。

cv::CV_Assert函数

创建一个与输入图像尺寸和数据类型均相同的输出图像。正如在存储部分所述,这需要根据通道的数量和子列的数目来定。依据以上两个数目,通过指针的迭代,遍历像素矩阵中的所有元素。

利用普通的C操作符[]存取像素,由于需要在同一时间需要访问多个行,所以必须获取多个行的指针(前一行,当前行和下一行),同时还需要用另一个指针指向存储计算值的地方。然后,只需利用操作符 []来访问像素,只要在每次操作之后,简单地将输出指针增加一个字节,便能方便地移动输出指针。

在图像的边界上,会有不存在的像素位置(如(-1)—(-1)),在这种情况下,公式未作出明确的定义,最为简单的解决方案是不对这些点使用内核,边界的像素值设置为0:

filter2D函数

在图像处理过程中,滤波器应用得非常普遍,在OpenCV中,有一个应用掩膜矩阵(在某些地方称之为内核)的函数。首先需要定义一个保存掩膜矩阵的对象:

然后调用filter2D()函数,指定输入图像、输出图像和所使用的内核:

该函数第五个参数为可选的参数,用来指定内核的中心;第六个参数用于在存储滤波像素之前,为其添加一个可选值;第七个参数用于确定对未定义的区域(边界)做什么操作。这个函数比较短小简洁,通过优化之后,速度要比hand-coded方法快。例如,在本项测试中,hand-coded方法花了约31毫秒时间,而第一种方法只用了13毫秒的时间,二者之间颇有些差异。

例如:

可以在YouTube上观看示例程序的运行视频。

注:本文以C++语言代码为例,获取Java和python版本可在原文中查看:

标签: #assert c语言报错