java opencv 基本操作4

    //minMaxLoc函数找出图像中最小值最大值函数
    //minMaxLoc( Mat src, mask=Mat() );
    //参数解释
    //参数1:InputArray类型的src,输入单通道数组(图像)。
    //参数2:InputArray类型的mask,用于选择子阵列的可选掩膜。
    //
    //说明:
    //1  minMaxLoc寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置.
    //2  参数若不需要,则置为NULL或者0,即可.

    //meanStdDev:
    //计算矩阵的均值和标准偏差。
    //meanStdDev(Mat src,MatOfDouble mean, MatOfDouble stddev)
    public void testMinMaxLoc() {
        Mat src = GeneralUtils.converMat("C:\\图片\\test\\0001.jpg");
        List mv = new ArrayList<>();
        Core.split(src, mv);

        //蓝色通道
        Mat Blue = mv.get(0);

        //计算蓝色通道最大值最小值
        Core.MinMaxLocResult result = new Core.MinMaxLocResult();
        result = Core.minMaxLoc(Blue);

        Double minVal = result.minVal;
        Double maxVal = result.maxVal;
        Point minLoc = result.minLoc;
        Point maxLoc = result.maxLoc;

        System.out.println("minVal:" + minVal);
        System.out.println("maxVal:" + maxVal);
        System.out.println("minLoc:" + minLoc);
        System.out.println("maxLoc:" + maxLoc);
        
        // 计算均值与方差
        MatOfDouble means = new MatOfDouble();
        MatOfDouble stddev = new MatOfDouble();
        Core.meanStdDev(src, means, stddev);

        System.out.println("blue channel->> mean:" + means.get(0, 0)[0] + ", " + "stddev:" + stddev.get(0, 0)[0]);
        System.out.println("greed channel->> mean:" + means.get(1, 0)[0] + ", " + "stddev:" + stddev.get(1, 0)[0]);
        System.out.println("red channel->> mean:" + means.get(2, 0)[0] + ", " + "stddev:" + stddev.get(2, 0)[0]);
    }


//normalize()函数可以对向量进行范数归一化或者范围归一化
    //normalize(Mat src, Mat dst, double alpha = 1, double beta = 0, intnorm_type = NORM_L2, int dtype = -1, Mat mask = noArray());
    //src:输入图像/数组
    //dst:输出图像/数组
    //alpha:范围的最小值
    //beta:范围的最大值(不用于范数归一化)
    //intnorm_type:归一操作的类型,有如下三种:
    //			NORM_MINMAX:将数组的数值归一化到[alpha,beta]内,常用。
    //			NORM_L1:归一化数组的L1-范数(绝对值的和)
    //			NORM_L2:归一化数组的(欧几里德)L2-范数
    //dtype:为负数时,输出数组的类型与输入数组相同,否则只是通道数相同,类型默认为:type = CV_MAT_DEPTH
    //mask:指定操作的区域/空间
    //归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快
    public void testNormalize() {
        Mat src = GeneralUtils.converMat("C:\\图片\\test\\0001.jpg");

        //转换成灰度图
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);

        //转换为浮点数类型数组
        gray.convertTo(gray, CvType.CV_32F);

        //NORM_MINMAX:将数组的数值归一化到[alpha,beta]内
        Mat dst = Mat.zeros(gray.size(), CvType.CV_32FC1);
        Core.normalize(gray, dst, 1.0, 0, Core.NORM_MINMAX);
        Mat result = new Mat();
        Core.multiply(dst, new Scalar(255), result);
        GeneralUtils.saveByteImg(result, "C:\\图片\\test\\NORM_MINMAX.jpg");

        //NORM_L1:归一化数组的L1-范数(绝对值的和)
        Core.normalize(gray, dst, 1.0, 0, Core.NORM_L1);
        Mat result1 = new Mat();
        Core.multiply(dst, new Scalar(255), result);
        GeneralUtils.saveByteImg(result1, "C:\\图片\\test\\NORM_L1.jpg");

        //NORM_L2:归一化数组的(欧几里德)L2-范数
        Core.normalize(gray, dst, 1.0, 0, Core.NORM_L2);
        Mat result2 = new Mat();
        Core.multiply(dst, new Scalar(255), result);
        GeneralUtils.saveByteImg(result2, "C:\\图片\\test\\NORM_L2.jpg");
    }

程序所引用的GeneralUtils:GeneralUtils

《景岳全书》

求关注!!

你可能感兴趣的:(java,opencv,系列,opencv,java,计算机视觉)