![62425a30c39395e36c6a1137f89d8b8f.png](https://i-blog.csdnimg.cn/blog_migrate/4d77ded92c6b5ec49b592303e69c9a84.jpeg)
矩阵的mask运算相当简单,就是通过一个mask矩阵(也称为核kernel)在图像中移动,并重新计算图像中的每个像素值。Mask矩阵决定着当前计算的像素点周围像素对其值的影响程度。从数学的角度来看,新的像素值是指定的数值进行了加权平均。通常所说的图像滤波、卷积、相关等运算都用到了该计算方法。下面是示例。
- 原文网址Mask operations on matrices
- 本地目录D:opencvsourcesdoctutorialscoremat-mask-operations
- 代码目录D:opencvsourcessamplescpptutorial_codecoremat_mask_operations
- GitHub 有相应文档和OpenCV源代码
- 版本OpenCV4.1.2(版本兼容性见英文原文,部分文档适用于OpenCV2.0和3.0)
- 环境Windows、C++、VS2019 Community
测试案例
这里是一个图像对比度增强的方法。用下面方法重新计算图像的像素值。
上面两个公式是等价的,后者更直观。公式表示,一个点的新像素值,是以该点为中心的3*3区域与为3*3的mask矩阵对应元素相乘,然后相加得到的。
代码
//---//自定义Sharpen()函数与filter2d()函数运行时间对比,实现同样的mask运算(锐化、滤波)---//
filter2D函数
filter2D有七个参数,上面例子用到了前面四个,分别是输入图像、输出图像、输出图像位深。第五个参数是指定核(mask)的中心位置,默认是中心。第六个是将计算结果加一个值(处理结果变亮或暗),第七个是填充边界的方法。
处理结果
原文提出filter2D函数快于自定义的sharpen函数,应该是在release模式下。在debug模式下却是filter2D函数较慢。原文给出的处理结果的图与代码中导入的图不一致,这里给出新测试出的结果。debug模式下,自定义函数运行时间仅为filter2D的1/3,而release下,变为1.4倍左右。filter2D的性能则是提升了70倍。
![fe272a196d9ef5c76fc9644b71830476.png](https://i-blog.csdnimg.cn/blog_migrate/9effdfc581f451711aed5eb74137a8f3.png)
![181303cd9bdade87f5018f749e53c3ad.png](https://i-blog.csdnimg.cn/blog_migrate/9c9b3e5d27dba99e3bb52f085b12ddb2.png)
![1e331e98795483269c51929cb03c7536.png](https://i-blog.csdnimg.cn/blog_migrate/d0e8086200be6fd2624395990fc61137.jpeg)
![7812ad8486c34c65d016303d6bf04954.png](https://i-blog.csdnimg.cn/blog_migrate/f0f113593be14f29a712e56be1b83eae.jpeg)