《Java图像处理:基于OpenCV与JVM》 ——1.9 从子矩阵生成矩阵

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

1.9 从子矩阵生成矩阵

  问题定义

让我们来学习如何手动地通过多个子矩阵生成一个完整的矩阵。

  解决方法

setTo和copyTo是OpenCV中两个非常重要的函数。setTo可以将一个矩阵中的所有像素设置为指定的颜色,而copyTo可以将一个已有的矩阵复制到另一个矩阵之中。当使用setTo或者copyTo时,你经常需要与子矩阵打交道,即只对矩阵中的一部分进行处理。

为了使用setTo,我们会用到OpenCV的Scalar对象来定义颜色,这里会使用RGB颜色空间的一组值来创建。让我们来看一下具体是怎么工作的。

  工作原理

第一个例子使用setTo将多个子矩阵合成一个矩阵,每个子矩阵有不同的颜色。

从彩色子矩阵生成矩阵

首先我们通过RGB值来定义颜色。之前提到过,颜色是通过Scalar对象创建出来的,包含三个整数值,每个值的范围是0~255。

第一个颜色值代表蓝色的深度,第二个值代表绿色的深度,最后一个值代表红色的深度。为了得到红色、绿色或者蓝色,可以把对应的颜色值设为最高值,即255,其他值设为0。

下面的例子介绍了如何得到红色、绿色和蓝色。

 image.png

为了定义蓝绿色、品红色和黄色,我们把这些颜色当作RGB的补充色。因此把其他通道设置为最大值255,主通道设置为0。

蓝绿色是红色的补充色,所以红色值通道被设为0,而另外两个通道为255:

 image.png

品红是绿色的补充色,黄色是蓝色的补充色,它们的值如下所示:

 image.png

我们把颜色都设置好了,现在使用这些对象来创建一个包含所有颜色的矩阵。接下来的setColors方法把输入的矩阵中的一行填充为主颜色RGB或补充色CMY。

我们来看一下如何使用setTo将子矩阵设置为给定的Scalar颜色。

 image.png

image.png

接下来,我们创建一个包含三个颜色通道的矩阵,并且填充它的第一行和第二行。

 image.png

结果是一个包含两行的矩阵,如图1-18所示,每一行都包含不同颜色的子矩阵。

 image.png

图1-18 包含不同颜色子矩阵的矩阵

从图片子矩阵生成矩阵

颜色很棒,但是你也许更希望能处理图像。第二个例子介绍如何使用图像填充子矩阵。

首先创建一个大小为200×200的矩阵和两个子矩阵:一个是主矩阵的上部,一个是主矩阵的下部。

 image.png

image.png

然后加载一个图片以创建另一个小矩阵,并把它的大小调整为上部(或下部)的子矩阵大小。这里会引入Imgproc类中的resize函数。

 image.png

当然,你可以任意选择其他的图像。这里,假设加载的图像如图1-19所示。

 image.png

图1-19 充满活力的猫咪

这个猫咪矩阵被复制到上部子矩阵和下部子矩阵。

请注意,之前设置大小的步骤很关键。复制能够成功,是因为小矩阵和子矩阵的大小是完全相同的,因此复制的时候没有出现任何问题。

 image.png

生成的matofpictures.jpg文件包含两只猫咪,如图1-20所示。

 image.png

图1-20 两只充满活力的猫咪

如果你忘了调整小矩阵的大小,那么复制会彻底失败,结果可能会是如图1-21所示的样子。


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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