《Java图像处理:基于OpenCV与JVM》 ——1.8 利用子矩阵修剪图像

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

1.8 利用子矩阵修剪图像

  问题定义

只保存图像指定的子区域。

  解决方法

这篇简短的攻略的主要目标是介绍submat函数。submat的返回值是一个矩阵对象,内容是原图的子矩阵或子区域。

  工作原理

读入一张猫咪图片,通过submat来截取我们想要的那部分内容。这个例子使用的猫咪图片如图1-12所示。

 image.png

图1-12 一只猫咪

当然,可以使用任何一张你喜欢的猫咪图片。现在,让我们使用imread来读取这个文件。

 image.png

根据观察可知,println输出了矩阵对象本身的一些信息。它的大部分信息与内存有关,所以你可以直接访问内存,同时它也显示了这个矩阵对象是否是一个子矩阵。在这个例子中,由于这个矩阵对象是原始图片,所以它的isSubmat值是false。

 image.png

如图1-13所示,Atom编辑器中的自动补全功能会向你提示不同版本的submat函数。

 image.png

图1-13 使用不同参数的submat函数

现在我们使用submat函数的第一种形式,输入参数是每一行和每一列的起始和终止值。

 image.png

输出的对象显示新创建的矩阵对象确实是一个子矩阵。

 image.png

你可以像处理普通矩阵对象那样来处理这个新建的子矩阵,例如可以尝试保存它。

 image.png

由于边界值是根据原始猫咪图片精心挑选的,我们可以得到图1-14中的漂亮结果。

有一件很好的事情是,当你对子矩阵进行了操作之后,原始矩阵也会受到同样的影响。例如,你对子矩阵中猫咪的脸进行了模糊处理,并且保存了整个矩阵(不是子矩阵),那么就只有猫咪的脸会变得模糊。具体操作如下所示:

 image.png

image.png

blur是org.opencv.imgproc.Imgproc类中的一个核心函数,它的输入参数是size对象,用来指明每个像素模糊区域大小,size越大,模糊的效果也越强。

模糊的结果如图1-15所示,当你仔细看的时候会发现,只有猫咪的脸部被模糊了,这也是我们之前保存的子矩阵的位置。

 image.png

图1-15 可怜的模糊猫咪

你之前也见到过submat函数的其他定义,还有两种方法可以获得子矩阵。

一种是采用两个Range参数,第一个代表行(y或高度)的范围,第二个代表列(x或宽度)的范围,都是使用Range类来创建的。

 image.png

另一种方法是使用矩形,首先给出左上角的坐标,然后是矩形的大小。

 image.png

后一种方法最常用,因为它最自然。同时,当在图片中检测物体时,你可以用该物体的包围框,它的类型是Rect对象。

值得注意的是,修改子矩阵会破坏原矩阵的效果。如果你想把子矩阵改成蓝色:

 image.png

submat3_2.png和submat3_3.png都会变成如图1-16所示的蓝***咪脸。

 image.png

图1-16 蓝***咪脸

同时原矩阵也会被变成如图1-17所示的样子!

 image.png

图1-17 大图中的蓝***咪脸

这里想表达的观点是,无论在何时何地使用submat函数,一定要小心谨慎,通常情况下,它是一个强有力的图像处理工具。


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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