《Java图像处理:基于OpenCV与JVM》 ——1.10 高亮显示图像中的物体

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

1.10 高亮显示图像中的物体

  问题定义

一张图片中包含一组物体、动物或者形状,也许是因为你想得到图像中物体的个数,想把它们高亮显示出来。

  解决方法

OpenCV提供了一个非常有名的函数叫作Canny,它可以高亮显示图像中的线条。本章的后几节会详细介绍Canny的用法。我们先使用Java来实现一些简单的操作。

OpenCV的Canny函数可以检测灰度矩阵中的轮廓。我们需要做的只是把输入的矩阵转换为灰度图像,剩下的工作将由Canny完成。

通过Core类中的cvtColor函数,OpenCV可以很容易地改变颜色空间。

  工作原理

假设你有一张工具图片,如图1-22所示。

 image.png

图1-22 工具图片

和往常一样,我们把图片加载到矩阵中。

 image.png

接下来,使用cvtColor函数来进行颜色转换,它的输入包含源矩阵、目标矩阵和目标颜色空间。颜色空间的常量可以在Imgproc类中找到,它们的名字以COLOR_为前缀。

使用颜色常量COLOR_RGB2GRAY,可以把矩阵变成黑白两色。

 image.png

这个黑白图像可以被直接送入Canny中。Canny函数包含以下参数:

源矩阵

目标矩阵

低阈值,使用150.0

高阈值,通常是低阈值的2倍或3倍

光圈,3~7之间的一个奇数,我们使用3。光圈值越大,被检测到的轮廓越多

L2梯度,暂时设置为true

对每一个像素,Canny使用一个卷积矩阵包含一个核心像素和它的邻居像素,得到一个梯度值。如果梯度值大于高阈值,那么它就被检测为边界。如果梯度值在高阈值和低阈值之间,并且有个高阈值和它连接,那么它也会被保留。

接下来,我们来调用Canny函数。

 image.png

输出的图片如图1-23所示。

 image.png

图1-23 Canny工具

为了保护眼睛、节省打印机油墨和树木资源,有些时候把矩阵中的白色变成黑色、黑色变成白色会让物体更容易辨认。反色操作可以通过Core类中的bitwise_not函数实现。

 image.png

 image.png

图1-24 反色的Canny工具

当然,也可以把Canny函数用在更多的猫咪图片中。图1-25~1-27展示了同样的Canny函数用在猫咪图片中的效果。

 image.png

图1-25 准备输入Canny函数的猫咪

 image.png

图1-26 使用Canny函数后的猫咪

 image.png

图1-27 对使用Canny处理后的猫咪进行反色操作


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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