opencv RGB图像转灰度图

这段代码的作用是将一个 3通道的 RGB 图像(CV_8UC3)转换为灰度图像(CV_8UC1,并使用 OpenCV 的 parallel_for_ 对图像处理进行并行加速。


🔍 一、函数功能总结

if (CV_8UC3 == img.type()) {// 创建灰度图 dst// 使用并行方式将 RGB 图像转为灰度图return dst;
}
  • 判断输入图像是否是 3通道 8 位无符号整型的 RGB 图像
  • 如果是,则创建一个 单通道灰度图 dst
  • 使用并行循环对每一行像素进行 RGB 转 Gray 操作
  • 返回灰度图像 dst

🧠 二、详细解释

✅ 条件判断:if (CV_8UC3 == img.type())

  • img.type() 是 OpenCV 中用于获取图像类型的函数。
  • CV_8UC3 表示:
    • 8U: 每个像素值是 8 位无符号整数(0~255)
    • C3: 有三个通道(Red, Green, Blue)

所以这句的意思是:“如果输入图像是一张标准的 RGB 彩色图像”。


📷 创建灰度图像:

dst.create(img.rows, img.cols, CV_8UC1);
  • 创建一个新的图像 dst
  • 大小与原图一致 (img.rows x img.cols)
  • 类型是 CV_8UC1:即单通道灰度图

⚙️ 并行处理图像:

cv::parallel_for_(cv::Range(0, img.rows), [&](const cv::Range &range) {for (int row = range.start; row < range.end; ++row) {...}
});
  • 使用 OpenCV 的并行机制 parallel_for_ 对图像的每一行进行遍历
  • 这里是按行并行化处理,适用于多核 CPU 加速大图像处理

🖼 像素级 RGB 转 Gray 计算:

const uchar* row_src = img.ptr<uchar>(row); // 获取当前行指针
uchar* row_dst = dst.ptr<uchar>(row);       // 获取目标行指针for (int col = 0; col < img.cols; ++col) {uchar red   = row_src[col * 3];uchar green = row_src[col * 3 + 1];uchar blue  = row_src[col * 3 + 2];row_dst[col] = static_cast<uchar>(0.114 * blue + 0.587 * green + 0.299 * red);
}
🎯 每个像素的操作:
  • 取出当前像素的 R、G、B 值
  • 使用加权平均公式将 RGB 转换为灰度值:

$$ Gray = 0.299 \times Red + 0.587 \times Green + 0.114 \times Blue $$

这是 ITU-R BT.601 标准推荐的亮度计算公式。


📌 三、为什么要这样写?性能优化!

✅ 为什么不用 cvtColor

虽然你可以简单地写:

cv::cvtColor(img, dst, COLOR_RGB2GRAY);

但这段代码可能出于以下目的而选择手动实现:

目的说明
性能优化在特定平台上或特定图像尺寸下,手动并行化可能比内置函数更快
控制精度明确指定颜色权重公式,避免不同库版本差异
教学/调试用途展示底层实现逻辑

🧪 四、输出结果举例

假设你有一张 RGB 图像,某个像素的颜色是:

red = 255, green = 128, blue = 0

那么灰度值为:

$$ Gray = 0.299 \times 255 + 0.587 \times 128 + 0.114 \times 0 ≈ 150 $$

所以这个像素在灰度图中会显示为一个偏暗的灰色。


✅ 五、完整流程图

输入 RGB 图像 (CV_8UC3)↓
判断是否为 RGB 图像↓
创建灰度图 (CV_8UC1)↓
[并行处理]↓
取出每个像素的 R/G/B 分量↓
应用加权公式转换为灰度值↓
保存到灰度图 dst↓
返回灰度图

🧰 六、扩展建议

🔄 替换为其他灰度公式(可选):

  • 平均法
    Gray = (red + green + blue) / 3;
  • 最大值法
    Gray = max(red, max(green, blue));

🧵 单线程版(用于调试):

for (int row = 0; row < img.rows; ++row) {const uchar* row_src = img.ptr<uchar>(row);uchar* row_dst = dst.ptr<uchar>(row);for (int col = 0; col < img.cols; ++col) {row_dst[col] = static_cast<uchar>(0.114 * row_src[col * 3 + 2] +0.587 * row_src[col * 3 + 1] +0.299 * row_src[col * 3]);}
}

✅ 七、应用场景

这种图像预处理常用于以下任务:

应用场景说明
ARUCO/AprilTag 检测灰度图是检测算法的标准输入格式
图像识别/匹配减少数据维度,提高效率
边缘检测Canny、Sobel 等算法通常基于灰度图
OCR 字符识别如 Tesseract 需要灰度图作为输入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React Hooks 的原理、常用函数及用途详解

1. ​​Hooks 是什么&#xff1f;​​ Hooks 是 React 16.8 引入的函数式组件特性&#xff0c;允许在不编写 class 的情况下使用 state 和其他 React 特性&#xff08;如生命周期、副作用等&#xff09;。​​本质是一类特殊函数​​&#xff0c;它们挂载到 React 的调度系统中…

学习路之PHP--webman协程学习

学习路之PHP--webman协程学习 一、准备二、配置三、启动四、使用 协程是一种比线程更轻量级的用户级并发机制&#xff0c;能够在进程中实现多任务调度。它通过手动控制挂起和恢复来实现协程间的切换&#xff0c;避免了进程上下文切换的开销 一、准备 PHP > 8.1 Workerman &g…

linux libusb使用libusb_claim_interface失败(-6,Resource busy)解决方案

linux libusb使用libusb_claim_interface失败&#xff08;-6&#xff0c;Resource busy&#xff09;解决方案 ✅ 问题原因&#x1f6e0;️ 解决方案&#x1f538; 方法一&#xff1a;分离内核驱动 libusb_detach_kernel_driver()&#x1f538; 方法二&#xff1a;使用 usb-devi…

使用mpu6500/6050, PID,互补滤波实现一个简单的飞行自稳控制系统

首先&#xff0c;参考ai给出的客机飞机的比较平稳的最大仰府&#xff0c;偏转&#xff0c;和防滚角度&#xff0c;如下&#xff1a; 客机的最大平稳仰俯&#xff08;Pitch&#xff09;、偏转&#xff08;Yaw&#xff09;和防滚&#xff08;Roll&#xff09;角度&#xff0c;通…

深度解析AD7685ARMZRL7:16位精密ADC在低功耗系统中的设计价值

产品概述 AD7685ARMZRL7是16位逐次逼近型&#xff08;SAR&#xff09;ADC&#xff0c;采用MSOP-10紧凑封装。其核心架构基于电荷再分配技术&#xff0c;支持2.3V至5.5V单电源供电&#xff0c;集成低噪声采样保持电路与内部转换时钟。器件采用伪差分输入结构&#xff08;IN/-&a…

EXCEL 实现“点击跳转到指定 Sheet”的方法

&#x1f4cc; WPS 表格技巧&#xff1a;如何实现点击单元格跳转到指定 Sheet 在使用 WPS 表格&#xff08;或 Excel&#xff09;时&#xff0c;我们经常会希望通过点击一个单元格&#xff0c;直接跳转到工作簿中的另一个工作表&#xff08;Sheet&#xff09;。这在制作目录页…

Python格式化:让数据输出更优雅

Python格式化&#xff1a;让数据输出更优雅 Python的格式化功能能让数据输出瞬间变得优雅又规范。不管是对齐文本、控制数字精度&#xff0c;还是动态填充内容&#xff0c;它都能轻松搞定。 一、基础格式化&#xff1a;从简单拼接开始 1. 百分号&#xff08;%&#xff09;格式…

2025年渗透测试面试题总结-小鹏[实习]安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 小鹏[实习]安全工程师 1. 自我介绍 2. 有没有挖过src&#xff1f; 3. 平时web渗透怎么学的&#xff0c;有…

VSCode科技风主题设计详细指南

1. 科技风设计的核心特点 科技风设计是一种强调未来感、现代感和高科技感的设计风格,在VSCode主题设计中,可以通过以下几个核心特点来体现: 1.1 色彩特点 冷色调为主:蓝色、紫色、青色等冷色调是科技风设计的主要色彩高对比度:深色背景配合明亮的霓虹色,形成强烈的视觉…

android知识总结

Activity启动模式 standard (标准模式) 每次启动该 Activity&#xff08;例如&#xff0c;通过 startActivity()&#xff09;&#xff0c;系统总会创建一个新的实例&#xff0c;并将其放入调用者&#xff08;启动它的那个 Activity&#xff09;所在的任务栈中。 singleTop (栈…

第3章 MySQL数据类型

MySQL数据类型 1、数字数据类型1.1 整数类型1.2 定点类型1.3 浮点类型1.4位值类型1.5 超出范围和溢出处理1.5.1 超出范围处理1.5.2 溢出处理 2、日期和时间数据类型3、字符串数据类型3.1 char和varchar类型3.2 binary和varbinary类型3.3 blob 和 text类型3.4 enum类型3.4.1 创建…

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…

mysql为什么一个表中不能同时存在两个字段自增

背景。设置sort自增。会引发错误 通常自增字段都是用于表示数据的唯一性。数据库限制。需要自定义排序字段大小。

牛客round95D

原题链接&#xff1a;D-小红的区间修改&#xff08;一&#xff09;_牛客周赛 Round 95 题目背景&#xff1a; 初始拥有一个长度10^100元素全为0的数组&#xff0c;进行q查询&#xff0c;每次查询如果区间内的元素都为0就将区间变为首项为 1、公差为 1 的等差数列&#xff1b;否…

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成

实践篇:利用ragas在自己RAG上实现LLM评估②

文章目录 使用ragas做评估在自己的数据集上评估完整代码代码讲解1. RAG系统构建核心组件初始化文档处理流程 2. 评估数据集构建3. RAGAS评估实现1. 评估数据集创建2. 评估器配置3. 执行评估 本系列阅读&#xff1a; 理论篇&#xff1a;RAG评估指标&#xff0c;检索指标与生成指…

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…

PostgreSQL 安装与配置全指南(适用于 Windows、macOS 与主流 Linux 发行版)

PostgreSQL 是一个功能强大、开源、稳定的对象关系数据库系统&#xff0c;广泛用于后端开发、数据处理与分布式架构中。本指南将手把手教你如何在 Windows、macOS 以及主流 Linux 发行版 上安装 PostgreSQL&#xff0c;并附上安装验证命令与基础配置方法。 一、Windows 安装与配…

WordPress博客文章SEO的优化技巧

在数字时代&#xff0c;博客不仅用于表达观点&#xff0c;也能提升品牌影响力并吸引潜在客户。许多服务器提供商&#xff08;如 Hostease&#xff09;支持 WordPress 一键安装功能&#xff0c;方便新手快速完成安装&#xff0c;专注于内容创作和 SEO 优化。然而&#xff0c;写出…

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…