《Java图像处理:基于OpenCV与JVM》 ——1.10 高亮显示图像中的物体
1.10 高亮显示图像中的物体
问题定义
一张图片中包含一组物体、动物或者形状,也许是因为你想得到图像中物体的个数,想把它们高亮显示出来。
解决方法
OpenCV提供了一个非常有名的函数叫作Canny,它可以高亮显示图像中的线条。本章的后几节会详细介绍Canny的用法。我们先使用Java来实现一些简单的操作。
OpenCV的Canny函数可以检测灰度矩阵中的轮廓。我们需要做的只是把输入的矩阵转换为灰度图像,剩下的工作将由Canny完成。
通过Core类中的cvtColor函数,OpenCV可以很容易地改变颜色空间。
工作原理
假设你有一张工具图片,如图1-22所示。
图1-22 工具图片
和往常一样,我们把图片加载到矩阵中。
接下来,使用cvtColor函数来进行颜色转换,它的输入包含源矩阵、目标矩阵和目标颜色空间。颜色空间的常量可以在Imgproc类中找到,它们的名字以COLOR_为前缀。
使用颜色常量COLOR_RGB2GRAY,可以把矩阵变成黑白两色。
这个黑白图像可以被直接送入Canny中。Canny函数包含以下参数:
源矩阵
目标矩阵
低阈值,使用150.0
高阈值,通常是低阈值的2倍或3倍
光圈,3~7之间的一个奇数,我们使用3。光圈值越大,被检测到的轮廓越多
L2梯度,暂时设置为true
对每一个像素,Canny使用一个卷积矩阵包含一个核心像素和它的邻居像素,得到一个梯度值。如果梯度值大于高阈值,那么它就被检测为边界。如果梯度值在高阈值和低阈值之间,并且有个高阈值和它连接,那么它也会被保留。
接下来,我们来调用Canny函数。
输出的图片如图1-23所示。
图1-23 Canny工具
为了保护眼睛、节省打印机油墨和树木资源,有些时候把矩阵中的白色变成黑色、黑色变成白色会让物体更容易辨认。反色操作可以通过Core类中的bitwise_not函数实现。
图1-24 反色的Canny工具
当然,也可以把Canny函数用在更多的猫咪图片中。图1-25~1-27展示了同样的Canny函数用在猫咪图片中的效果。
图1-25 准备输入Canny函数的猫咪
图1-26 使用Canny函数后的猫咪
图1-27 对使用Canny处理后的猫咪进行反色操作
- 点赞
- 收藏
- 关注作者
评论(0)