5.java openCV4.x 入门-Mat之像素读写

本文详细介绍了OpenCV中的Mat对象如何进行像素级别的操作,包括设置特定位置的像素值(put函数)、使用掩码进行区域设置(setTo函数)以及获取像素值(get函数)。重点讲解了put函数的两种用法和get函数的两种参数形式。
摘要由CSDN通过智能技术生成
专栏简介

💒个人主页
📰专栏目录

点击上方查看更多内容
📖心灵鸡汤📖

我们唯一拥有的就是今天,唯一能把握的也是今天


建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 4.Mat之创建、复制
⬇️ 6.Mat之局部区域读写及Range和Rect介绍


  

一、像素操作

1.设置像素

  只列举部分常用函数的用法。
这里简单说明下掩码(mask)
  1.mask是一个与矩阵相同大小的矩阵,用于指定哪些位置需要设置值。
  2.mask矩阵中的元素可以是0或者非0,如果mask中对应位置的值是非0,则对应位置的值会被设置为value;如果mask中对应位置的值是0,则对应位置的值不会被改变。
mask拓展说明:从前景背景的角度来说的话,0可以表示背景,非0表示前景,转换下思维理解为修改对应前景部分的像素值。

1.put

   将指定位置的像素值替换为指定的数据。此函数返回值为替换元素的个数(关于更多相关内容可以观看视频)
1.我们这里就列举两个方法,其它方法比较容易理解,就不再举例了
1.

put​(int[] idx, byte[] data, int offset, int length)
参数:
idx 指定像素的位置,使用int数组表示,例如idx = {row, col}表示第row行第col列的像素
data 要替换的像素数据,使用byte数组表示(不同的data类型,对应着不同的数据类型(CvType)
offset 一个整数,表示从字节数组中的哪个位置开始替换元素。(整数向左,负数向右,不没有数据时,默认元素值补0)
length 一个整数,表示要替换的元素的数量
        //使用put(int[] idx, byte[] data, int offset, int length)
        Mat ones = Mat.ones(new Size(5, 5), CvType.CV_8UC1);
        System.out.println("设置前 = \n" + ones.dump());
        //设置坐标
        int[] idx = {1,1};
        //设置像素值,
        byte[] data = {2,3,4};
        //设置偏移量
        int offset=-1;
        //设置元素长度
        int length=3;
        ones.put(idx,data,offset,length);

        System.out.println("设置后 = \n" + ones.dump());

请自行验证结果,建议在保持其它值不变的情况下,只修改其中一个参数的值,查看修改后的结果,更容易理解该方法
2.

put​(int row, int col, double... data)
参数:
row 所在行索引,即y轴坐标
col 所在列索引,即x轴坐标
data 可变参数,我们可以随意输入参数值的个数,方法内部会将参数值转换成数组
        Mat mat = new Mat(5,5,CvType.CV_8UC1);
        //设置值
        mat.put(0,0,1,2,3,4,5,6,7,8,9);
        System.out.println("mat.dump() =\n " + mat.dump());

2.setTo

  将矩阵的指定区域设置为给定的值。(我们这里只列举使用mask掩码的方法,不使用mask时,将全局设置成指定的值

setTo​(Scalar value, Mat mask)
参数:
value Scalar对象,用于设置的元素值
mask 掩码
        Mat ones = Mat.ones(new Size(5, 5), CvType.CV_8UC1);
        //设置掩码
        Mat mask = Mat.zeros(5,5,CvType.CV_8UC1);
        //设置掩码,只修改感兴趣的位置的像素值
        mask.put(0,0,2);
        ones.setTo(new Scalar(10),mask);
        System.out.println("结果 = \n" + ones.dump());

请自行验证

2.获取像素

获取指定位置的像素值。

1.get

  1. 此函数返回一个double[]
get​(int row, int col)
参数:
row 所在行索引,即y轴坐标
col 所在列索引,即x轴坐标
        Mat mat = new Mat(5,5,CvType.CV_8UC1);
        //设置值
        mat.put(0,0,1,2,3,4,5,6,7,8,9);
        //获取值
        double[] doubles = mat.get(0, 2);
        //由于我们的矩阵为单通道。所以doubles[]中只有一个值,只取doubles[0]
        double aDouble = doubles[0];
        System.out.println("aDouble = " + aDouble);

2.这里仅以byte类型为例。

get​(int[] idx, byte[] data)
参数:
idx 指定像素的位置,以数组形式表示
data 一个byte数组,用于存储像素值
        Mat mat = new Mat(5,5,CvType.CV_8UC1);
        //设置值
        mat.put(0,0,1,2,3,4,5,6,7,8,9);
        System.out.println("mat.dump() =\n " + mat.dump());
        //获取值
        int [] idx={1,1};
        byte [] data =new byte[1];
        mat.get(idx,data);
        System.out.println("data = "+data[0]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要喷香水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值