java opencv 平移_《Java图像处理:基于OpenCV与JVM》 ——1.8 利用子矩阵修剪图像...

1.8 利用子矩阵修剪图像

问题定义

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

解决方法

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

工作原理

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

c94cbdce517d6f82812710659f09224e.png

图1-12 一只猫咪

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

b8f5af6414cc257cfbd1a82c9f8317d2.png

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

056d1bb2401726d153928bda2ec2a8c9.png

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

91e734da305dc0f5400182bcdcb9f066.png

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

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

3e9e8841948c437d7e06ba1f4f4bf2ef.png

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

c4c702bad85125739155e2d689294466.png

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

26c82820c1b020b5086a157b4708c0d8.png

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

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

a52417ef12333373088bedde06a7eee1.png

3a1f84de7d5f67837eb6be1d84c4ec63.png

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

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

12973bb39e55a56fddfadc7b51ea4770.png

图1-15 可怜的模糊猫咪

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

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

1a35e9225aa3c1f87fe5592b0aa2cd15.png

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

58ebeb20dcf9b660a05c8eb5f1d7765b.png

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

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

a50e1a9d28396056db9e349b7ede12b9.png

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

e1fe8648242f8e532f7ed25769142f8d.png

图1-16 蓝***咪脸

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

4cd06bafee23dd150cf322e3c27e8440.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值