《Java图像处理:基于OpenCV与JVM》 ——1.9 从子矩阵生成矩阵
1.9 从子矩阵生成矩阵
问题定义
让我们来学习如何手动地通过多个子矩阵生成一个完整的矩阵。
解决方法
setTo和copyTo是OpenCV中两个非常重要的函数。setTo可以将一个矩阵中的所有像素设置为指定的颜色,而copyTo可以将一个已有的矩阵复制到另一个矩阵之中。当使用setTo或者copyTo时,你经常需要与子矩阵打交道,即只对矩阵中的一部分进行处理。
为了使用setTo,我们会用到OpenCV的Scalar对象来定义颜色,这里会使用RGB颜色空间的一组值来创建。让我们来看一下具体是怎么工作的。
工作原理
第一个例子使用setTo将多个子矩阵合成一个矩阵,每个子矩阵有不同的颜色。
从彩色子矩阵生成矩阵
首先我们通过RGB值来定义颜色。之前提到过,颜色是通过Scalar对象创建出来的,包含三个整数值,每个值的范围是0~255。
第一个颜色值代表蓝色的深度,第二个值代表绿色的深度,最后一个值代表红色的深度。为了得到红色、绿色或者蓝色,可以把对应的颜色值设为最高值,即255,其他值设为0。
下面的例子介绍了如何得到红色、绿色和蓝色。
为了定义蓝绿色、品红色和黄色,我们把这些颜色当作RGB的补充色。因此把其他通道设置为最大值255,主通道设置为0。
蓝绿色是红色的补充色,所以红色值通道被设为0,而另外两个通道为255:
品红是绿色的补充色,黄色是蓝色的补充色,它们的值如下所示:
我们把颜色都设置好了,现在使用这些对象来创建一个包含所有颜色的矩阵。接下来的setColors方法把输入的矩阵中的一行填充为主颜色RGB或补充色CMY。
我们来看一下如何使用setTo将子矩阵设置为给定的Scalar颜色。
接下来,我们创建一个包含三个颜色通道的矩阵,并且填充它的第一行和第二行。
结果是一个包含两行的矩阵,如图1-18所示,每一行都包含不同颜色的子矩阵。
图1-18 包含不同颜色子矩阵的矩阵
从图片子矩阵生成矩阵
颜色很棒,但是你也许更希望能处理图像。第二个例子介绍如何使用图像填充子矩阵。
首先创建一个大小为200×200的矩阵和两个子矩阵:一个是主矩阵的上部,一个是主矩阵的下部。
然后加载一个图片以创建另一个小矩阵,并把它的大小调整为上部(或下部)的子矩阵大小。这里会引入Imgproc类中的resize函数。
当然,你可以任意选择其他的图像。这里,假设加载的图像如图1-19所示。
图1-19 充满活力的猫咪
这个猫咪矩阵被复制到上部子矩阵和下部子矩阵。
请注意,之前设置大小的步骤很关键。复制能够成功,是因为小矩阵和子矩阵的大小是完全相同的,因此复制的时候没有出现任何问题。
生成的matofpictures.jpg文件包含两只猫咪,如图1-20所示。
图1-20 两只充满活力的猫咪
如果你忘了调整小矩阵的大小,那么复制会彻底失败,结果可能会是如图1-21所示的样子。
- 点赞
- 收藏
- 关注作者
评论(0)