专栏简介 | ||
💒个人主页 📰专栏目录 点击上方查看更多内容 | 📖心灵鸡汤📖 我们唯一拥有的就是今天,唯一能把握的也是今天 建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫 | 🧭文章导航🧭 ⬆️ 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
- 此函数返回一个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]);