【OpenCV】分离多通道图像RGB的值

2023-11-05

原文地址:http://blog.csdn.net/xiaowei_cqu/article/details/7558657/

【1】计算图像ROI区域RGB的平均值,cvAvg函数。

【2】通道分离,合并的时候要特别的注意,分离之后的图像时单通道的灰度图像,最后面显示的彩色图像为方便视觉观察得到的效果。

但是我感觉还是不对,因为其他的两个通道的颜色值不变,而想要看的通道的值取零,这样得到的显然不是单通道的图像。

《访问图像中每个像素的值》中我们介绍了存储图像的结构体IplImage的数据结构。多通道字节/浮点型图像中存储了每个像素RGB三信道的值。

最近在做的项目中需要提取图像ROI区域RGB的平均值,发现有一个cvAvg函数:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CvScalar cvAvg( const CvArr* arr, const CvArr* mask=NULL );  
可以独立计算数组每个通道的平均值,非常方便。所以用如下方式即可达到效果:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CvScalar avgChannels = cvAvg(img);    
  2. double avgB=avgChannels.val[0];  
  3. double avgG=avgChannels.val[1];  
  4. double avgR=avgChannels.val[2];  
那如果我们想分离出每个通道的具体值,可以用cvSlip(或cvCvtPixToPlane)函数:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,  
  2.                CvArr* dst2, CvArr* dst3 );  
  3. #define cvCvtPixToPlane cvSplit  
如果再想把分离的图像显示出来,可以分别create三个单通道的图像,即:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. IplImage* rImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);    
  2. IplImage* gImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);    
  3. IplImage* bImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);    

此时的效果是这样的,三个灰色图像:


但我其实想做个演示效果,就是要那种看出分离的是“红”“绿”“蓝”的效果。

于是尝试用cvCvtColor将单通道图转换为多通道图:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void cvCvtColor( const CvArr* src, CvArr* dst, int code );    
  2. // src为单通道图像,dst为多通道图像,code设置为CV_GRAY2BGR  
结果还是一样的……

那就手动用cvMerge()自己重新Merge一个多通道图吧:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. IplImage* rImg3=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);    
  2. IplImage* gImg3=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);    
  3. IplImage* bImg3=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);   
  4. cvMerge(0,0,rImg,0,rImg3);  
  5. cvMerge(0,gImg,0,0,gImg3);  
  6. cvMerge(bImg,0,0,0,bImg3);  
结果还是一样的……

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. cvMerge(rImg,rImg,rImg,0,rImg3);  
还是原来的效果!!!这次我真囧了……(其实后来想起C#里没有灰度图的类型,显示灰度图就是靠这种方式:把RGB的值设置成相同的)

最后尝试如下方式:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. cvMerge(bImg,gImg,0,0,rImg3);  
  2. cvMerge(bImg,0,rImg,0,gImg3);  
  3. cvMerge(0,gImg,rImg,0,bImg3);  
才终于达到了想要的效果:


哈哈~


(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【OpenCV】分离多通道图像RGB的值 的相关文章

  • Aruco 标记与 openCv,获取 3d 角坐标?

    我正在使用 opencv 3 2 检测打印的 Aruco 标记 aruco estimatePoseSingleMarkers corners markerLength camMatrix distCoeffs rvecs tvecs 这将
  • 向 ca cv::Mat 添加文本比 cv::putText() 更好的方法吗?

    我想在 a 上添加一些文字cv Mat but cv putText 对我来说不够灵活 结盟 我需要将可变长度的标签放在运行时已知的几个像素位置 但由于cv putText 将输出的原点始终放在左侧 如果位置离左侧太远 我的文本就会消失在图
  • Ubuntu OpenCV 无法编译

    我正在尝试使用以下命令编译 OpenCV 3 2 1 cmake DCMAKE BUILD TYPE Release DBUILD SHARED LIBS OFF DCMAKE INSTALL PREFIX usr local DOPENC
  • ld:找不到 -llibtbb.dylib 的库

    我尝试从 opencv 2 4 8 apps haarfinder 编译一些文件 但出现以下错误 ld library not found for llibtbb dylib 注意双l在文件名中 我尝试按照这里的教程进行操作 http co
  • 使用 OpenCV 进行车牌识别

    我有一个项目 需要使用 OpenCV 识别汽车的车牌 我想加载数字或字母的图像 让 OpenCV 识别它并将其打印到控制台 有一个函数可以做到这一点吗 如果没有 我该怎么办 Note 我正在研究灰度级 请帮忙 我必须在一周后完成 谢谢你的快
  • iOS 上的 OpenCV - GPU 使用情况?

    我正在尝试开发一个 iOS 应用程序 可以对来自相机的视频执行实时效果 就像 iPad 上的 Photobooth 一样 我熟悉 OpenCV 的 API 但如果大多数处理是在 CPU 上完成而不是在 GPU 上完成 我担心 iOS 上的性
  • 为 Visual Studio 安装 openCV 2.4 for C/C++

    我一整天都在尝试在 Windows 7 上的 C C 上安装 Visual Studio 2010 的 OpenCV 版本 2 4 1 和 2 4 2 我一直在关注这个教程 http docs opencv org trunk doc tu
  • 使用 OpenCV 裁剪黑色边缘

    我认为这应该是一个很简单的问题 但我找不到解决方案或有效的关键字进行搜索 我只有这个图像 黑边没有用 所以我想把它们剪掉 只留下 Windows 图标 和蓝色背景 我不想计算Windows图标的坐标和大小 GIMP 和 Photoshop
  • C++ OpenCV imread 无法在 Android 中工作

    我正在尝试读取 C 代码中的图像 LOGD Loading image s n inFile c str Mat img imread inFile CV LOAD IMAGE GRAYSCALE CV Assert img data 0
  • 将四边形(四边形)拟合到斑点

    应用不同的过滤和分割技术后 我最终得到如下图像 我可以访问一些轮廓检测函数 这些函数返回该对象边缘上的点列表 或者返回一个拟合的多边形 尽管有很多边 远多于 4 个 我想要一种将四边形适合该形状的方法 因为我知道它是应该是四边形的鞋盒的正面
  • 屏幕截图中低分辨率文本的 OCR

    我正在编写一个 OCR 应用程序来从屏幕截图图像中读取字符 目前 我只关注数字 我的方法部分基于这篇博文 http blog damiles com 2008 11 basic ocr in opencv http blog damiles
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • 查找彼此接近的对象边界

    我正在研究一个计算机视觉问题 其中问题的第一步是找到物体彼此靠近的位置 例如 在下图中 我感兴趣的是找到灰色标记的区域 Input Output 我目前的方法是首先反转图像 然后通过侵蚀进行形态梯度跟随 然后删除一些不感兴趣的轮廓 脚本如下
  • 计算两个描述符之间的距离

    我正在尝试计算已计算的两个描述符之间的距离 欧几里得或汉明 问题是我不想使用匹配器 我只想计算两个描述符之间的距离 我正在使用 OpenCV 2 4 9 并且我的描述符存储在 Mat 类型中 Mat descriptors1 Mat des
  • 来自 OpenCV 的外部参数

    我正在使用 OpenCV 来校准立体相机对 我拍摄了各种校准照片 并且使用 cv2 calibrateCamera 对内在参数进行了令人满意的拟合 然而 目前尚不清楚如何获取外部参数 该函数仅返回cameraMatrix 尽管它很有用 但实
  • 我是否必须使用我的数据库训练 Viola-Jones 算法才能获得准确的结果?

    我尝试提取面部数据库的面部特征 但我认识到 Viola Jones 算法在两种情况下效果不佳 当我尝试单独检测眼睛时 当我尝试检测嘴巴时 运作不佳 检测图像的不同部分 例如眼睛或嘴巴 或者有时会检测到其中几个 这是不可能的情况 我使用的图像
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • OpenCV 错误:使用 COLOR_BGR2GRAY 函数时断言失败

    我在使用 opencv 时遇到了一个奇怪的问题 我在 jupyter 笔记本中工作时没有任何问题 但在尝试运行此 Sublime 时却出现问题 错误是 OpenCV错误 cvtColor中断言失败 深度 CV 8U 深度 CV 16U 深度
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • OpenCV Visual Studio ntdll.dll

    我尝试在 Visual Studio 2013 上使用 OpenCV 2 4 10 创建一个项目 但由于以下异常 到目前为止我运气不佳 请建议帮助 TIA letstryitonemoretime exe Win32 Loaded C Us

随机推荐

  • 黑暗精灵修改为国内源

    第1步 修改 etc pacman d mirrorlist vim etc pacman d mirrorlist 1 第2步 修改 etc pacman d blackarch mirrorlist vim etc pacman d b
  • python 安装whl文件

    python 安装whl文件 使用场景 在terminal中 通过 pip install 命令进行第三方模块安装时 由于网络获其他原因会使得第三方模块下载失败 导致安装失败 此时 我们可以先通过下载网址将第三方模块包手动下载到本地 再手动
  • Linux系统下 查找已安装软件的命令

    1 find 使用find查找文件的所在路径 find 查找路径 查找参数 在根目录下查找以 conf结尾的文件 find name conf 2 ps 通过查找进程的方法找到对应的包的路径 ps ef grep mongo 也可以简写成
  • mysql5.7.13+VS3013 源代码阅读调试

    之前写Java 对C make cmake都不是很熟 所以参考了以下这些前辈写的博客 最后成功搭建了mysql5 7 13 VS3013调试环境 自己总结了需要需要注意的几点 Windows VS2012环境下编译调试MySQL源码 一 W
  • SQLServer如果指定列列值相同则用逗号拼接其他指定列数据 stuff函数+for xml path

    for xml path 就是将 sql 查询出来的内容以XML的格式显示出来 Stuff 查询字符串 开始位置 数字 长度 数字 需插入的字符串 示例 55替换abcd123字符串中的a 示例 55替换abcd123字符串中的abcd 示
  • vue+Echarts绘制k线图(二)--分时图和交易量图

    目录 1 前言 2 分时图 2 1 vue引入Echarts 2 2 分时图介绍 2 3 分时折线图配置 2 4 组合交易量图 2 5 鼠标指示数据设置 2 6 项目完整代码 3 总结 1 前言 近来发现Echarts API越发的强大 对
  • 二分查找的各种应用详解(C++)

    基本概念 Binary Search 二分查找也称折半查找 它是一种效率较高的查找方法 使用二分查找要求线性表必须采用顺序存储结构 而且表中元素按关键字有序排列 基本原理 查找 因为序列已经单调且有序排列 从中间位置开始比较 一次可以排除一
  • 只考一门数据结构!安徽工程大学计算机考研

    安徽工程大学 考研难度 内容 23考情概况 拟录取和复试分析 院校概况 23专业目录 23复试详情 各专业考情分析 各科目考情分析 正文992字 预计阅读 3分钟 2023考情概况 安徽工程大学计算机相关各专业复试和拟录取分析 083500
  • 分布式开放消息系统(RocketMQ)的原理与实践

    分布式开放消息系统 RocketMQ 的原理与实践 作者 CHEN川 关注 2016 02 25 15 43 字数 6784 阅读 135462 评论 49 喜欢 351 赞赏 7 一年前为了一次内部分享而写的这篇文章 没想到会有这么多人阅
  • (ANC)前三章思维导图总结

    最近发现对于一本书 如果一点点事无巨细的做笔记 效率会比较低 于是改变了一下之前的读书方式 用思维导图的做读书笔记 这样便于了解整本书的框架和每章的大致内容 也仅限于自己做笔记用
  • 数据结构和算法(栈的模拟、前中后缀表达式、表达式求值步骤和思路)

    1 栈的介绍 栈的英文为 stack 栈是一个先入后出 FILO First In Last Out 的有序列表 栈 stack 是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表 允许插入和删除的一端 为变化的一端 称
  • qt中qwt的安装的方式

    参考大神博客 https blog csdn net imkelt article details 51234230 utm medium distribute pc relevant none task blog BlogCommendF
  • Error in nextTick “TypeError Cannot read property ‘xxx‘ of undefined“

    报这个错主要是因为子组件还没加载完成就对子组件进行赋值 推荐使用第一个 this nextTick gt 修改子组件的内容 或 setTimeout gt 修改子组件的内容 50 父组件传值给子组件 子组件不能直接修改 会报错 子组件修改父
  • JavaScript中的endsWith

    如何在JavaScript中检查字符串是否以特定字符结尾 示例 我有一个字符串 var str mystring 我想知道该字符串是否以 结尾 我该如何检查 JavaScript中是否有endsWith 方法 我有一个解决方案是获取字符串的
  • 嘴说手画一文搞懂Spark的Join

    Spark Sql的Join和关系型数据库Sql的Join有很多相同点 比如inner join left join right join full join 这是二者都有的概念 并且含义相同 但是 Spark Sql是分布式执行 面对的是
  • ADB命令开启和关闭飞行模式,两段式操作方式!!!!

    开启飞行模式 必须要先执行1 再执行2 执行1 adb shell settings put global airplane mode on 1 执行2 adb shell am broadcast a android intent act
  • Docker部署Elasticsearch集群

    编写docker compose yml version 3 7 services es01 image elasticsearch 7 10 1 container name es01 ports 9200 9200 9300 9300
  • dc-1 靶机渗透学习

    环境 Vmware 虚拟机软件 dc 1 靶机ip地址 192 168 202 130 kali攻击机ip地址 192 168 202 129 本次渗透过程kali攻击机和dc靶机都采取NAT模式 信息收集 首先用ipconfig查看当前k
  • 初始化k8s踩过的坑

    问题一 error execution phase preflight couldn t validate the identity of the API Server abort connecting 这个问题网上有很多的解决方法 大致有
  • 【OpenCV】分离多通道图像RGB的值

    原文地址 http blog csdn net xiaowei cqu article details 7558657 1 计算图像ROI区域RGB的平均值 cvAvg函数 2 通道分离 合并的时候要特别的注意 分离之后的图像时单通道的灰度