目录
一、像素值统计
1)最值及相应位置
使用Core.minMaxLoc()
函数来计算图像的最大值和最小值,以及它们的位置。这个函数适用于单通道图像。
// 假设你已经有一个Mat对象src
// 查找图像的最大值和最小值及其位置
MatOfDouble minVal = new MatOfDouble();
MatOfDouble maxVal = new MatOfDouble();
MatOfPoint minLoc = new MatOfPoint();
MatOfPoint maxLoc = new MatOfPoint();
Imgproc.minMaxLoc(src, minVal, maxVal, minLoc, maxLoc);
2)均值和标准差
使用Core.meanStdDev()
函数来计算图像的均值和标准差。这个函数适用于单通道或多通道图像。
// 计算图像的均值和标准差
Mat mean = new Mat();
Mat stddev = new Mat();
Imgproc.meanStdDev(src, mean, stddev);
ps:离散度分析
在统计学中,方差是衡量数据离散程度的一个重要指标。既已通过Core.meanStdDev()
函数计算出了标准差(stddev),而方差则是标准差的平方。因此,你可以直接使用计算出的标准差来计算方差。
二、绘制几何图形
1)直线
// 创建一个Mat对象作为画布
Mat mat = new Mat(800, 800, CvType.CV_8UC3, new Scalar(255, 255, 255)); // 白色背景
// 绘制直线
Imgproc.line(mat, new Point(100, 50), new Point(600, 50), new Scalar(0, 0, 255), 2); // 红色直线,宽度为2
2)矩形
// 绘制矩形
Imgproc.rectangle(mat, new Point(100, 100), new Point(400, 400), new Scalar(0, 255, 0), -1); // 绿色填充矩形
Imgproc.rectangle(mat, new Point(500, 100), new Point(700, 300), new Scalar(255, 0, 0), 3); // 红色矩形边框,宽度为3
3)多边形
// 绘制多边形
List<MatOfPoint> points = new ArrayList<>();
points.add(new MatOfPoint(new Point(100, 600)));
points.add(new MatOfPoint(new Point(300, 700)));
points.add(new MatOfPoint(new Point(500, 600)));
points.add(new MatOfPoint(new Point(400, 400)));
Imgproc.polylines(mat, points, true, new Scalar(0, 0, 255), 2); // 红色多边形,宽度为2
4)圆形
// 绘制圆形
Imgproc.circle(mat, new Point(400, 400), 100, new Scalar(255, 255, 0), 3); // 黄色圆形边框,宽度为3
Imgproc.circle(mat, new Point(200, 200), 50, new Scalar(0, 0, 255), -1); // 红色填充圆形
5)椭圆
// 绘制椭圆
Imgproc.ellipse(mat, new Point(600, 400), new Size(200, 100), 0, 0, 360, new Scalar(255, 0, 255), 2); // 紫色椭圆边框,宽度为2
6)文字
// 设置字体和大小
String fontFace = Core.FONT_HERSHEY_SIMPLEX;
double fontScale = 1;
// 绘制文字
Imgproc.putText(mat, "Hello, OpenCV!", new Point(100, 700), fontFace, fontScale, new Scalar(0, 255, 255), 2); // 青色文字,宽度为2
ps:使用matToBitmap将绘制好的Mat
对象转换为Bitmap,具体见前文~(一)
三、调整图像亮度和对比度
/**
* 调整图像的亮度和对比度
*
* @param src 输入图像(Mat对象)
* @param dst 输出图像(Mat对象)
* @param brightness 亮度调整值
* @param contrast 对比度系数
*/
private void adjustBrightnessAndContrast(Mat src, Mat dst, int brightness, double contrast) {
// 创建临时Mat对象用于存储中间结果
Mat temp = new Mat();
src.convertTo(temp, -1, contrast, brightness); // 应用亮度和对比度调整公式:像素值 = 原始像素值 * 对比度系数 + 亮度调整值
temp.copyTo(dst); // 将调整后的图像复制到输出Mat对象中
}
四、颜色模型及转换
1)RGB颜色模型
基本概念:RGB颜色模型基于红色(Red)、绿色(Green)和蓝色(Blue)三个通道来描述颜色。每个通道的颜色强度范围通常为0到255,通过不同强度的组合可以产生各种颜色。
通道顺序:在OpenCV中,通常使用BGR(蓝、绿、红)顺序来存储图像数据,这与一些图像文件格式(如JPEG)的存储顺序一致。但OpenCV也提供了相应的函数来转换到RGB顺序。
颜色描述范围:RGB模型能够覆盖人眼可见的大部分颜色范围,是计算机显示设备显示颜色的标准颜色空间。
用途:RGB颜色模型广泛应用于图像显示、处理和计算机视觉任务中,特别是在需要精确控制颜色的场合。
2)YUV颜色模型
基本概念:YUV颜色模型是一种基于亮度(Luminance,Y)和色度(Chrominance,U和V)来描述颜色的模型。Y代表亮度分量,U和V代表色度分量。
视频传输中的作用:YUV模型将亮度和色度信息分开,使得在视频压缩和传输中可以更高效地对色度信息进行压缩,同时保持图像的亮度信息不变。这种分离使得YUV模型在视频处理中特别有用,尤其是在需要减少带宽和存储需求的场合。
特点:YUV模型能够兼容黑白电视机和彩色电视机,因为黑白电视机只需要使用亮度分量Y即可显示图像。而彩色电视机则可以通过将YUV编码转换为RGB编码来显示彩色图像。
用途:YUV颜色模型主要用于视频压缩、传输和存储中,特别是在需要高效压缩数据的场合。
3)HSV颜色模型
基本概念:HSV颜色模型基于色调(Hue)、饱和度(Saturation)和亮度(Value,有时也称为明度)三个分量来描述颜色。色调表示颜色的种类,饱和度表示颜色的纯度或强度,亮度表示颜色的明亮程度。
与人类感知颜色的方式的关系:HSV模型更符合人类对颜色的感知方式,因为色调、饱和度和亮度是人们在描述颜色时经常使用的属性。这使得HSV模型在图像处理中特别有用,特别是在需要基于颜色进行分割或分析的场合。
特点:HSV模型将颜色信息分离成独立的分量,使得某些类型的图像处理任务(如颜色检测、跟踪等)变得更加简单。
用途:HSV颜色模型广泛应用于图像处理和计算机视觉任务中,特别是在需要基于颜色进行操作的场合。
4)Lab颜色模型
基本概念:Lab颜色模型是一种基于人眼感知的颜色表示方法。它包括亮度(L)和两个色度分量(a和b)。Lab模型是一种设备无关的颜色模型,意味着它不受显示设备或照明条件的影响。
设备无关的特性:Lab模型能够在不同设备之间保持颜色的一致性,这使得它在图像分析和计算机视觉任务中特别有用。特别是在需要跨设备或跨平台保持颜色一致性的场合。
用途:Lab颜色模型主要用于图像分析和计算机视觉任务中,特别是在需要处理颜色一致性的场合。
5)Gray颜色模型(灰度图像)
基本概念:Gray模型并不是一个彩色模型,而是一个灰度图像的模型。灰度图像只有单通道,灰度值根据图像位数不同由0到最大依次表示由黑到白。
图像处理中的优势:灰度图像在图像处理中具有一定的优势,如占用存储空间小、易于采集和传输等。此外,灰度图像还可以用于某些特定的图像处理任务(如边缘检测、形态学处理等)。
用途:灰度图像广泛应用于图像处理的各个领域,特别是在需要减少计算量或突出图像亮度信息的场合。
6)颜色空间的转换
// 读取图像文件
String imagePath = "path/to/your/image.jpg"; // 替换为你的图像路径
Mat src = Imgcodecs.imread(imagePath);
if (src.empty()) {
System.out.println("无法读取图像文件");
return;
}
// 创建用于存储转换结果的Mat对象
Mat yuvImage = new Mat();
Mat hsvImage = new Mat();
Mat labImage = new Mat();
Mat grayImage = new Mat();
// 将图像从BGR转换为RGB(OpenCV默认读取为BGR)
Mat rgbImage = new Mat();
Imgproc.cvtColor(src, rgbImage, Imgproc.COLOR_BGR2RGB);
// RGB到YUV转换
Imgproc.cvtColor(rgbImage, yuvImage, Imgproc.COLOR_RGB2YUV);
// RGB到HSV转换
Imgproc.cvtColor(rgbImage, hsvImage, Imgproc.COLOR_RGB2HSV);
// RGB到Lab转换(注意:OpenCV中的Lab转换需要先转换到XYZ再转换到Lab)
Mat xyzImage = new Mat();
Imgproc.cvtColor(rgbImage, xyzImage, Imgproc.COLOR_RGB2XYZ);
Mat temp = new Mat();
xyzImage.convertTo(temp, CvType.CV_32F); // Lab转换需要浮点型数据
Imgproc.cvtColor(temp, labImage, Imgproc.COLOR_XYZ2Lab);
// RGB到Gray转换
Imgproc.cvtColor(rgbImage, grayImage, Imgproc.COLOR_RGB2GRAY);
// 保存转换后的图像(可选)
Imgcodecs.imwrite("path/to/save/yuvImage.jpg", yuvImage); // 替换为你的保存路径
Imgcodecs.imwrite("path/to/save/hsvImage.jpg", hsvImage); // 替换为你的保存路径
Imgcodecs.imwrite("path/to/save/labImage.jpg", labImage); // 替换为你的保存路径
Imgcodecs.imwrite("path/to/save/grayImage.jpg", grayImage); // 替换为你的保存路径
// 释放资源(可选,但推荐在不再需要Mat对象时释放它们)
src.release();
rgbImage.release();
yuvImage.release();
hsvImage.release();
labImage.release();
grayImage.release();