《Java图像处理:基于OpenCV与JVM》 ——1.11 使用Canny结果作为掩膜
1.11 使用Canny结果作为掩膜
问题定义
Canny的边缘检测非常棒,它的输出还可以被作为掩膜(mask),用于生成一个精美的艺术化图片。
让我们来尝试把Canny的结果画在另一张图片上。
解决方法
当进行复制操作时,可以使用一个叫作掩膜的参数。掩膜是一个单通道的矩阵,值只包含0和1。
当使用掩膜进行复制时,如果掩膜中的像素值是0的话,源矩阵中的像素就不会被复制,如果值是1的话,源像素就会被复制到目标矩阵中。
工作原理
在1.10节攻略中,根据bitwise_not函数输出的结果,我们得到了一个新的矩阵对象。
如果你决定把kittens输出的话(也许不是一个好主意,因为文件很大),你会看到一堆0和1,这就是掩膜的制作方法。
现在有了掩膜,我们来创建一个叫作target的白色矩阵,作为copy函数的目标参数。
然后为copy函数加载一个源矩阵,你应该记得,我们需要确定它的大小和copy函数的目标矩阵(也就是target矩阵)的大小一致。
让我们来调整背景对象的大小。
这样我们就准备好进行复制操作了。
输出的矩阵如图1-28所示。
图1-28 蓝色背景中的猫咪
接下来你可以回答这个问题:为什么猫咪是白色的?
正确答案其实是,底层的矩阵在初始化时是纯白色的,参照new Mat(..., WHITE)声明。当掩膜阻碍了一个像素的复制,也就是说掩膜中这个像素对应的值是0时,矩阵原来的颜色就会显示出来,这里是白色,这也是图1-28中的猫咪是白色的原因。你当然可以尝试一个黑色背景的源矩阵,或者是自己选择一个图片。
在接下来的章节,我们将看到更多的例子。
- 点赞
- 收藏
- 关注作者
评论(0)