《Java图像处理:基于OpenCV与JVM》 ——1.11 使用Canny结果作为掩膜

举报
华章计算机 发表于 2020/02/20 20:20:30 2020/02/20
【摘要】 本节书摘来自华章计算机《Java图像处理:基于OpenCV与JVM》 —— 书中第1章,第1.11节,作者是[法] 尼古拉斯·莫德奇克(Nicolas Modrzyk) ,魏 兰 潘婉琼 译 。

1.11 使用Canny结果作为掩膜

  问题定义

Canny的边缘检测非常棒,它的输出还可以被作为掩膜(mask),用于生成一个精美的艺术化图片。

让我们来尝试把Canny的结果画在另一张图片上。

  解决方法

当进行复制操作时,可以使用一个叫作掩膜的参数。掩膜是一个单通道的矩阵,值只包含0和1。

当使用掩膜进行复制时,如果掩膜中的像素值是0的话,源矩阵中的像素就不会被复制,如果值是1的话,源像素就会被复制到目标矩阵中。

  工作原理

在1.10节攻略中,根据bitwise_not函数输出的结果,我们得到了一个新的矩阵对象。

 image.png

如果你决定把kittens输出的话(也许不是一个好主意,因为文件很大),你会看到一堆0和1,这就是掩膜的制作方法。

现在有了掩膜,我们来创建一个叫作target的白色矩阵,作为copy函数的目标参数。

 image.png

然后为copy函数加载一个源矩阵,你应该记得,我们需要确定它的大小和copy函数的目标矩阵(也就是target矩阵)的大小一致。

让我们来调整背景对象的大小。

 image.png

这样我们就准备好进行复制操作了。

 image.png

输出的矩阵如图1-28所示。

 image.png

图1-28 蓝色背景中的猫咪

接下来你可以回答这个问题:为什么猫咪是白色的?

正确答案其实是,底层的矩阵在初始化时是纯白色的,参照new Mat(..., WHITE)声明。当掩膜阻碍了一个像素的复制,也就是说掩膜中这个像素对应的值是0时,矩阵原来的颜色就会显示出来,这里是白色,这也是图1-28中的猫咪是白色的原因。你当然可以尝试一个黑色背景的源矩阵,或者是自己选择一个图片。

在接下来的章节,我们将看到更多的例子。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。