android opencv之旅(二)初步了解Mat

图像的存储

我们平时看到的图像,对于计算机来说只是一堆亮度各异的点,不同的图像所包含的信息量也是不同的,很明显彩色图像就要比灰度图像包含的信息多很多,因为彩色图像是多通道的(比如RGB图像是三通道、RGBA图像为四通道),而灰度图像是单通道的。简单来说,一个M * N的图像就是一个M * N的矩阵(灰度图像)。
OpenCV正是使用Mat对象来存储图像,该对象保存了行数、列数、数据等可以唯一标识该图像的信息。

灰度图像

在灰度图像中,数字代表颜色的亮度。当以整数表示时,范围为0 ~ 255,其中0代表纯黑色,255代表纯白色。如果用浮点数来表示,那么像素值就以0 ~ 1 之间的数值表示,0代表纯黑色,1代表纯白色。
我们随便打印一张灰度图像的第一个像素点:

log("i:" + i + ";j:" + j + "---" + Arrays.toString(mat.get(i,j)));

06-06 08:01:19.150 14629-14629/com.lxf.ndkdemo I/System.out: i:0;j:0---[47.0]

说明该图像为单通道,该点亮度为47.0 。

彩色图像

在彩色图像中,比如RGB图像,第一个通道代表蓝色,第二个通道代表绿色,第三个通道代表红色,即BGR。如果是RGBA图像,则第四个通道代表透明度。
我们随便打印一张彩色图像的像素点:

log("i:" + i + ";j:" + j + "---" + Arrays.toString(mat.get(i,j)));

06-06 08:01:19.118 14629-14629/com.lxf.ndkdemo I/System.out: i:100;j:100---[224.0, 187.0, 136.0, 255.0]

说明该图像为四通道,四个值分别对应BGRA 。

Mat的创建

  • 图片与Mat互转
//读取图片,转化为Mat
Imgcodecs.imread(String fileName);
//Mat写入图片
Imgcodecs.imwrite(String fileName, Mat src);
  • Bitmap与Mat互转
//bitmap转mat
Mat dst = new Mat();
Utils.bitmapToMat(bitmap, dst);
//mat转bitmap
Bitmap bitmap = Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mat, bitmap);

当然Mat也可以自己创建,sdk中提供了一些列的构造方法。

Mat中像素点的获取和修改

Mat类中提供了get和put方法用来获取某个像素点的值,返回double[]。长度表示通道数。

    // row表示第几行  col表示第几列
    public double[] get(int row, int col) {
        return nGet(nativeObj, row, col);
    }

    // row表示第几行  col表示第几列  data为自己要改的值
    public int put(int row, int col, double... data) {
        //。。。
        return nPutD(nativeObj, row, col, data.length, data);
    }

你可能感兴趣的:(android opencv之旅(二)初步了解Mat)