android openCV 应用 (二)统计、绘图、图像增强、颜色模型及转换

目录

一、像素值统计

1)最值及相应位置

2)均值和标准差

二、绘制几何图形

1)直线

2)矩形

3)多边形

4)圆形

5)椭圆

6)文字

三、调整图像亮度和对比度

四、颜色模型及转换

1)RGB颜色模型 

2)YUV颜色模型

3)HSV颜色模型

4)Lab颜色模型

5)Gray颜色模型(灰度图像)

6)颜色空间的转换


一、像素值统计

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值