//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<Mat> 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
求关注!!