news 2026/8/20 1:20:51

OpenCV计算机视觉开发入门与实践<十三>:图像转换之灰度图、二值图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCV计算机视觉开发入门与实践<十三>:图像转换之灰度图、二值图

1.图像转换

颜色变换是 imgproc 模块中一个常用的功能。我们生活中大多数看到的彩色图片都是 RGB 类型的,但是在进行图像处理时需要用到灰度图、二值图、HSV、HSI 等颜色制式,OpenCV 提供了cvtColor()函数来实现这些功能。这个函数用来进行颜色空间的转换,随着 OpenCV 版本的升级,对于颜色空间种类的支持也越来越多,因此涉及不同颜色空间之间的转换,比如 RGB 和灰度的互转、RGB 和 HSV(六角锥体模型,这个模型中颜色的参数分别是色调 H、饱和度 S、明度 V)的互转等。

cvtColor 函数声明如下:

voidcvtColor(InputArray src,OutputArray dst,intcode,intdstCn=0);

其中参数 src 用于输入图像,即要进行颜色空间变换的原图像,可以是 Mat 类;OutputArray dst用于输出图像,即进行颜色空间变换后存储的图像,也可以是 Mat 类;code 表示转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片;dstCn 表示目标图像通道数,默认取值为 0,如果取值为 0,就由 src 和 code 决定。

InputArray 和 OutputArray 都是接口类,它们可以是 Mat、Mat_、Mat_<T, m, n>、vector、vector<vector>和 vector。

函数 cvtColor 的作用是将一个图像从一个颜色空间转换到另一个颜色空间,但是从 RGB 向其他类型转换时,必须明确指出图像的颜色通道。值得注意的是,在 OpenCV 中,其默认的颜色制式排列是 BGR 而非 RGB。所以对于 24 位颜色图像来说,前 8 位是蓝色,中间 8 位是绿色,最后8 位是红色。

需要注意的是,cvtColor()函数不能直接将 RGB 图像转换为二值图像,需要借助 threshold 函数。

我们常用的颜色空间转换有两种:BGR 转为 Gray 和 BGR 转为 HSV。下面来看一个例子,将图像转换为灰度图和 HSV。

#include<iostream>#include<opencv2\imgproc\types_c.h>//for CV_RGB2GRAY#include<opencv2/core.hpp>#include<opencv2/highgui.hpp>#include<opencv2/imgproc.hpp>#pragmacomment(lib,"opencv_world4140d.lib")//引用引入库usingnamespacestd;usingnamespacecv;intmain(){Mat srcImage=imread("1.jpg");//判断图像是否加载成功if(!srcImage.data){cout<<"图像加载失败!"<<endl;returnfalse;}elsecout<<"图像加载成功!"<<endl<<endl;//显示原图像namedWindow("原图像",WINDOW_AUTOSIZE);imshow("原图像",srcImage);//将图像转换为灰度图,采用 CV_前缀Mat grayImage;cvtColor(srcImage,grayImage,CV_RGB2GRAY);//将图像转换为灰度图namedWindow("灰度图",WINDOW_AUTOSIZE);imshow("灰度图",grayImage);//将图像转换为 HSV,采用 COLOR_前缀Mat HSVImage;cvtColor(srcImage,HSVImage,COLOR_BGR2HSV);//将图像转换为 HSV 图namedWindow("HSV",WINDOW_AUTOSIZE);imshow("HSV",HSVImage);waitKey(0);return0;}

2.CV_BGR2GRAY 和CV_RGB2GRAY 用法区别

在 OpenCV 中,CV_BGR2GRAY 和 CV_RGB2GRAY 的选择非常简单:它取决于你手中的图像数据,其通道顺序是 BGR 还是 RGB。

简单来说,绝大多数 OpenCV 函数(如 imread 读取的彩色图)默认是 BGR 格式,此时应使用 CV_BGR2GRAY。

要理解原因,我们需要看看它们内部的计算方式,以及你的数据是以什么顺序存储的。

1)工作方式

这两种转换最终都将彩色图片转为灰度图,但内部处理逻辑是不同的,这源于OpenCV对通道顺序的定义。

CV_BGR2GRAY:它“认为”输入图像的数据是按B(蓝)、G(绿)、R(红) 的顺序存储的。转换时,它会按照这个顺序去提取三个通道的值,并用一个固定的亮度公式(Gray = 0.114B + 0.587G + 0.299*R)来计算灰度值。其中,绿色分量对亮度的贡献最大,这与人的视觉感知相符。

CV_RGB2GRAY:它则“认为”输入图像的数据是按R(红)、G(绿)、B(蓝) 的顺序存储的。它的计算过程也是去提取“它以为的”R、G、B通道,然后套用同一个公式(Gray = 0.114R + 0.587G + 0.299*B)。

2)什么时候用哪个

选择哪个,关键看数据源,完全取决于你代码中 src 这个图像的实际通道存储顺序。

  1. 使用 CV_BGR2GRAY:

这是最常见的情况。来源:用 cv::imread() 不加参数地读取一张彩色图片时,OpenCV 默认就会把数据解码成 BGR 顺序存储。一个常见的误区是,误以为图片是RGB,但其实OpenCV内部处理的通道顺序就是BGR。

其他函数:很多 OpenCV 的图像处理函数,其输出的彩色图像也是 BGR 顺序。

  1. 使用 CV_RGB2GRAY

这种情况比较少见,主要发生在你的图像数据来源不是OpenCV标准函数时。来源:例如,你使用了其他图像库(如 Qt 的 QImage),或者直接从摄像头原始数据中获取了 RGB 格式的像素数据。在这些情况下,你需要确认你的数据确实是按 R, G, B 的顺序存储的。

  1. 如果选错了会怎样?

如果你拿一个 BGR 顺序的图片,却用了 CV_RGB2GRAY,OpenCV 会“误以为”第一个通道是R,第二个是G,第三个是B。这样一来,转换时它会错误地将原本的蓝色和红色通道数据混淆,导致最终生成的灰度图像颜色层次错误,与正常预期不符。

这里有一个相关的接口:cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY);。在现代OpenCV版本中,CV_前缀的枚举值已逐渐被COLOR_前缀取代,但功能完全一致。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 1:13:56

【AI Agent面试题】检索 rerank 为什么重要,怎么做?

从"向量召回不够准"讲到召回 精排两阶段 面向做 RAG 的开发者 做 RAG 时经常遇到这样的怪事&#xff1a;把 top-k 从 5 调到 20&#xff0c;答案反而更差了。检查召回&#xff0c;正确的那段其实在里面&#xff0c;但排在第 12 位&#xff0c;被前面一堆"看起…

作者头像 李华
网站建设 2026/8/20 1:12:11

双积分政策倒计时:企业应对策略与合规路径深度解析

1. 政策倒计时下的企业众生相距离“双积分”年度考核的最终清算日&#xff0c;只剩下不到一百天的时间窗口。对于汽车行业内的从业者&#xff0c;尤其是负责企业合规与战略的同行来说&#xff0c;这三个月堪称“黎明前的黑暗”。办公室里&#xff0c;财务、法务、产品规划几个部…

作者头像 李华
网站建设 2026/8/20 1:09:30

Whisky 上手指南:M 芯片 Mac 免费畅跑 Windows 软件的完整图文教程

Whisky 上手指南&#xff1a;M 芯片 Mac 免费畅跑 Windows 软件的完整图文教程 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 深夜的安装包&#xff0c;和那个愣住的瞬间 先讲一个…

作者头像 李华
网站建设 2026/8/20 1:08:52

从KV Cache到Prefix Caching:Agent框架中的缓存一致性挑战与设计策略

1. 面试官到底在问什么&#xff1f;从 Prefix Caching 到 Agent 框架的缓存一致性最近在准备淘天这类大厂的技术面试&#xff0c;发现一个高频且深度的问题组合&#xff1a;“Prefix Caching 原理是什么&#xff1f;Agent 框架怎么保证不破坏缓存&#xff1f;” 这问题看似是两…

作者头像 李华
网站建设 2026/8/20 0:55:29

嵌入式开发入门:从LED闪烁项目掌握GPIO控制与开发环境搭建

1. 项目概述&#xff1a;从“Hello, World!”到硬件世界的敲门砖如果你刚拿到一块Arduino、ESP32或者STM32开发板&#xff0c;看着上面那个小小的LED灯&#xff0c;心里琢磨着“我该怎么让它听我指挥&#xff1f;”&#xff0c;那么恭喜你&#xff0c;你找对地方了。让LED灯闪烁…

作者头像 李华