本节书摘来自华章计算机《opencv图像处理》一书中的第2章,第2.5节,作者:[西]葛罗瑞亚·布埃诺·加西亚(gloria bueno garcía)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看
算术运算是重载运算。这就意味着可以在mat图像上执行和下面这个例子一样的运算:
在opencv中,一种运算的结果值受到饱和运算(saturation arithmetic)的影响。这就意味着最终的值实际上是在0~255范围内最近似的一个整数。
当用掩码进行运算时,位运算bitwise_and()、bitwise_or()、bitwise_xor()和bitwise_not()非常有用。掩码是二值图像,表示这样一些像素(而不是整幅图像)在其上仅执行一种运算。下面的bitwise_and示例向您展示如何使用and运算剪裁一幅图像的一部分:
在读取并显示输入图像之后,通过绘制一个全白色的圆可创建一个掩码。and运算会用到这个掩码。该逻辑运算只对掩码值非零的那些像素进行,其余像素不会受到影响。最后,在本示例中用白色填充生成图像的外部(即圆的外部)。在进行该运算时,使用了之前介绍过的一种像素访问方法。由此产生的图像见图2-2:
接下来,给出另一个很棒的示例,估计pi的值。如图2-3所示,让我们考虑一个正方形及其内接圆:
我们假设有一个未知边长的正方形图像和一个内接圆。可以通过在图像内的随机位置绘制许多像素并计算位于内接圆中的像素个数来估计内接圆的面积。另一方面,估计正方形的面积为绘制的像素总数。这样使用上面的公式就可以估计出pi的值。
下面的算法模拟了这个过程:
(1)在一个黑色的正方形图像上,画一个纯白色的内接圆;
(2)在另一个黑色的正方形图像上(和上面的正方形大小相同),随机绘制大量像素;
(3)在两幅图像之间进行一个and运算,并计算所产生的图像中的非零像素个数;
(4)使用公式估计pi。
估计pi值示例的代码如下:
该程序完全遵循上面的算法。注意,使用函数countnonzero计算非零(在该示例中是白色)像素。对于npixels=8000,其估计值为3.125。npixels的值越大,估计结果也就越好,如图2-4所示。