Java 基于 OpenCV4.4 - 利用子矩阵生成矩阵教程 (五)

本文介绍了如何在OpenCV中利用setTo和copyTo函数操作子矩阵,包括通过多种颜色填充矩阵和通过调整图片子矩阵生成完整图像。重点展示了如何通过Scalar对象设置不同颜色,以及如何合并蓝绿、品红和黄色等补充色。
摘要由CSDN通过智能技术生成

一、通过多个子矩阵生成一个完整的矩阵

     在OpenCV中两个非常重要的函数:setTo和copyTo。setTo可以将一个矩阵中的所有像素设置为指定的颜色,而copyTo可以将一个已有的矩阵复制到另一个矩阵之中。当使用setTo或者copyTo时,你经常需要与子矩阵打交道,即只对矩阵中的一部分进行处理。为了使用setTo,我们会用到OpenCV的Scalar对象来定义颜色,这里会使用RGB颜色空间的一组值来创建。

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

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

1. 第一个例子通过使用 setTo() 将多个子矩阵合成一个矩阵,每个子矩阵有不同的颜色。

通过 Scalar对象 获得到红色、绿色和蓝色。代码实现:

        // 定义获取 红绿蓝 三色
        Scalar scalarRed = new Scalar(0,0,255);
        Scalar scalarGreen = new Scalar(0,255,0);
        Scalar scalarBlue = new Scalar(255,0,0);

接下来,定义蓝绿色、品红色和黄色,我们把这些颜色当作RGB的补充色。因此把其他通道设置为最大值255,主通道设置为0。蓝绿色是红色的补充色,所以红色值通道被设为0,而另外两个通道为255;代码实现:

        Scalar CYAN = new Scalar(255,255,0);
        // 品红是绿色的补充色,黄色是蓝色的补充色,它们的值如下所示:
        Scalar MAGENTA = new Scalar(255,0,255);
        Scalar YELLOW = new Scalar(0,255,255);

 2. 通过使用setTo将子矩阵设置为给定的Scalar颜色。

此处暂无代码实现.....  后续更新

 

 

二、从图片子矩阵生成矩阵

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

        int width = 200 ,heigth = 200 ;
        Mat mat = new Mat(heigth,width,CvType.CV_8UC3);
        Mat top = mat.submat(0,heigth/2,0,width);
        Mat bottom = mat.submat(heigth/2,heigth,0,width);

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

        Mat small = Imgcodecs.imread("D:\\ProgramFiles\\personDocument\\picture\\888.png");
        Imgproc.resize(small,small,top.size());

         imwrite("D:\\ProgramFiles\\personDocument\\picture\\3.png", small);

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

     @Test
    public void test15() throws Exception {
        URL url = ClassLoader.getSystemResource("lib/opencv_java440.dll");
        System.load(url.getPath());

        int width = 200 ,heigth = 200 ;
        Mat mat = new Mat(heigth,width,CvType.CV_8UC3);
        Mat top = mat.submat(0,heigth/2,0,width);
        Mat bottom = mat.submat(heigth/2,heigth,0,width);

        Mat small = Imgcodecs.imread("D:\\ProgramFiles\\personDocument\\picture\\888.png");
        Imgproc.resize(small,small,top.size());

        imwrite("D:\\ProgramFiles\\personDocument\\picture\\3.png", small);

        small.copyTo(top);
        small.copyTo(bottom);
        imwrite("D:\\ProgramFiles\\personDocument\\picture\\4.png", mat);
        imshow("submat Image after:", mat);
        waitKey();
    }

生成的 4.png  文件包含两个图片。如图:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值