当前位置: 首页 > news >正文

嵌入式人工智能应用-第三章 opencv操作 4 灰度处理

嵌入式人工智能应用

嵌入式人工智能应用-第三章 opencv操作 4 灰度处理

  • 嵌入式人工智能应用
  • 1 灰度处理
  • 2 算法
    • 2.1 均值方法
    • 2.2 最大值法
    • 2.3 分量法
    • 2.4 加权平均法(Weighted Average Method)
    • 2.5 系统自带方法
  • 3 总结

1 灰度处理

图像灰处理即是将一幅彩色图像转换为灰度化图像的过程。彩色图像通常包括 R、G、B 三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色图像的 R、G、B 三个分量相等的过程。灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度,灰度值大的像素点比较亮,反之比较暗,像素值最大为 255(表示白色),像素值最小为 0(表示黑色)。灰度处理有很多中方法,例如一张彩色图片,OpenCV 在读取这张图片的时候就可以直接读取为灰度图像。还可以调用 OpenCV 提供的 cvtColor 接口进行灰度处理(前面的实验中已经用到了)。还可以使用平均值法、最大值法、分量法、加权平均法等让一张彩色的图片转换成灰度图像。

灰度处理是将彩色图像转换为灰度图像的过程,保留亮度信息但丢弃颜色信息,常用于简化计算、提升处理速度或适配某些算法(如边缘检测)。

在这里插入图片描述

2 算法

2.1 均值方法

均值法就是 把每个像素的 B、G、R 三个颜色通道的值加起来,然后取平均值,作为这个像素的灰度值。

公式如下:
在这里插入图片描述

​✅ 优点:
实现简单
运算速度快

❌ 缺点:
没考虑人眼对颜色的敏感度(人眼对绿色更敏感,对蓝色不敏感)
效果可能不如加权平均法自然

// 均值法
cv::Mat grayByMean(const cv::Mat& colorImage) {cv::Mat grayImage(colorImage.size(), CV_8UC1);for (int i = 0; i < colorImage.rows; i++) {for (int j = 0; j < colorImage.cols; j++) {cv::Vec3b pixel = colorImage.at<cv::Vec3b>(i, j);uchar gray = (pixel[0] + pixel[1] + pixel[2]) / 3;  // B + G + RgrayImage.at<uchar>(i, j) = gray;}}return grayImage;
}

2.2 最大值法

最大值法是一种将彩色图像转换为灰度图像的简单方法。它的原理是 取每个像素的 B、G、R 三个颜色通道中数值最大的那个,作为灰度值。

在这里插入图片描述
最大值法的特点:
会强调颜色中最亮的分量,比如绿色值大,那么灰度图会更亮。
有点像对图像的“亮度增强”处理,所以整体可能比加权平均法或均值法看起来更亮一些。

✅ 优点:
简单,容易实现
能强调图像中亮的部分,对某些场景有用(如亮度检测)

❌ 缺点:
不符合人眼感知模型,容易失真
会丢失颜色信息之间的平衡,某些细节可能变得不自然

// 最大值法
cv::Mat grayByMax(const cv::Mat& colorImage) {cv::Mat grayImage(colorImage.size(), CV_8UC1);for (int i = 0; i < colorImage.rows; i++) {for (int j = 0; j < colorImage.cols; j++) {cv::Vec3b pixel = colorImage.at<cv::Vec3b>(i, j);uchar gray = std::max({pixel[0], pixel[1], pixel[2]});grayImage.at<uchar>(i, j) = gray;}}return grayImage;
}

2.3 分量法

分量法就是:直接使用彩色图像中某一个颜色通道(R、G 或 B)来作为灰度图像的灰度值。换句话说,不做任何计算,直接拿一个通道的值当作灰度值。

在这里插入图片描述
✅ 优点:
运算快(不需要计算平均值或加权)
可用于突出某种颜色特征的区域,比如只关注红色区域就用 R 通道

❌ 缺点:
不是真正意义上的“综合灰度图”
颜色失衡,比如只看 R,图像中其他颜色会被忽略

// 分量法(以红色通道为例)
cv::Mat grayByComponent(const cv::Mat& colorImage, int channel = 2) {// channel = 0: Blue, 1: Green, 2: Redcv::Mat grayImage(colorImage.size(), CV_8UC1);for (int i = 0; i < colorImage.rows; i++) {for (int j = 0; j < colorImage.cols; j++) {grayImage.at<uchar>(i, j) = colorImage.at<cv::Vec3b>(i, j)[channel];}}return grayImage;
}

2.4 加权平均法(Weighted Average Method)

把 B、G、R 三个颜色通道按照人眼对它们的感知敏感度,给不同的权重,计算出一个灰度值。

在这里插入图片描述
这个权重是根据**人眼对颜色的感知模型(ITU-R BT.601 标准)**定下来的:

人眼对 绿色最敏感,所以权重大:0.587
对 红色也比较敏感:0.299
对 蓝色不太敏感:0.114

✅ 优点:
最符合人眼视觉感知的灰度图
图像细节自然、对比度适中
是工业界和学术界默认方法(包括 OpenCV、Pillow、Matlab 等)

❌ 缺点:
运算稍微比“均值法”复杂一点(但在现代计算中可以忽略)

// 加权平均法
cv::Mat grayByWeightedAverage(const cv::Mat& colorImage) {cv::Mat grayImage(colorImage.size(), CV_8UC1);for (int i = 0; i < colorImage.rows; i++) {for (int j = 0; j < colorImage.cols; j++) {cv::Vec3b pixel = colorImage.at<cv::Vec3b>(i, j);uchar gray = static_cast<uchar>(0.114 * pixel[0] + 0.587 * pixel[1] + 0.299 * pixel[2]);grayImage.at<uchar>(i, j) = gray;}}return grayImage;
}

2.5 系统自带方法

将彩色图像转换为灰度图像。

cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY);

3 总结

在这里插入图片描述

相关文章:

  • C++11特性补充
  • 图论基础:图存+记忆化搜索
  • 相得益彰 — 基于 GraphRAG 事理图谱驱动的实时金融行情新闻资讯洞察
  • Linux 常用指令用户手册
  • 字节跳动发布UI-TARS-1.5,入门AI就来近屿智能
  • 大数据学习栈记——MapReduce技术
  • 【JAVA EE初阶】多线程(1)
  • 基于SpringBoot+Vue实现的旅游景点预约平台功能一
  • [密码学实战]密码服务平台部署架构详解与学习路线
  • QT+CDB进行debug调试无法查看QString等qt相关变量值问题的修复
  • AI——神经网络以及TensorFlow使用
  • 树莓派超全系列教程文档--(36)树莓派条件过滤器设置
  • 测试新版oda teigha,开发webcad,实现在线查看dwg图纸
  • 人工智能-机器学习其他技术(决策树,异常检测,主成分分析)
  • hadoop分布式部署
  • 基于深度学习的线性预测:创新应用与挑战
  • JSON-RPC远程控制
  • AI与思维模型【69】——人类误判心理
  • 方案精读:数字政府智慧政务服务一网通办服务解决方案【附全文阅读】
  • 【Oracle专栏】删除用户 释放表空间
  • 李家超:香港特区政府积极推进十五运会各项筹办工作
  • “特朗普的欧洲耳语者”:梅洛尼白宫之行真能打破美欧关税僵局?
  • 直播电商监管新规将公开征求意见,出重拳净化行业生态
  • 碳访|储能行业将迎市场化考验,宁德时代:我们希望“卷价值”
  • 中使馆驳斥加方炒作所谓“中国网络威胁”行为:停止无端攻击抹黑
  • 上海刚刚经历了史上最热的四月上半月,明天冲击32℃