C++ RGB转灰度图像

本文介绍了如何使用C++将RGB图像转换为灰度图像,通过心理学公式并进行优化,包括将浮点运算转换为整数运算,使用移位操作以及降低精度来提高转换速度。示例代码展示了简化后的转换过程。

RGB转灰度,通常会使用下面的一个心理学公式:(Matlab和OpenCV中使用的也是该公式)

Gray = 0.2989*R + 0.5870*G + 0.1140*B

抛却指令优化不谈,优化转化速度的最直接方法就是将浮点运算转化为整数运算:

比如我们可以将上式转化为:

Gray = (2989*R + 5870*G + 1140*B)/ 10000,

但是上面的除法还是不够快,我们完全可以使用移位操作来代替:

Gray = (4898*R + 9618*G + 1868*B)>> 14

此外,对大部分计算机视觉应用来说,图像的精度问题不是一个特别敏感的问题,因此我们可以通过降低精度来进一步减少计算量:(我通常使用8位精度)

Gray = (76*R + 150*G + 30*B)>> 8

对应的C++ 程序也比较简单:

bool rgb2gray(
C++实现RGB图像到灰度图像转换有多种方法,以下为你详细介绍: ### 手动实现转换 通过手动遍历RGB图像的每个像素,按照特定的权重计算灰度值。以下是示例代码: ```cpp #include <iostream> bool rgb2gray(unsigned char *src, unsigned char *dest, int width, int height) { int r, g, b; for (int i = 0; i < width * height; ++i) { r = *src++; // 读取红色通道 g = *src++; // 读取绿色通道 b = *src++; // 读取蓝色通道 // 计算加权平均值,将结果赋值给目标灰度图像 *dest++ = (r * 76 + g * 150 + b * 30) >> 8; } return true; } ``` 该函数`rgb2gray`接收源图像数据`src`、目标图像数据`dest`、图像宽度`width`和高度`height`作为参数,将RGB图像转换灰度图像[^4]。 ### 使用OpenCV库实现转换 OpenCV是一个强大的计算机视觉库,提供了便捷的函数进行颜色空间转换。以下是使用OpenCV将RGB图像转换灰度图像的示例代码: ```cpp #include <cstdio> #include <iostream> #include "opencv2/opencv.hpp" void RGBToGray(const cv::Mat &src, cv::Mat &des) { for (int r = 0; r < src.rows; r++) { for (int c = 0; c < src.cols; c++) { cv::Vec3b m = src.at<cv::Vec3b>(r, c); int gray = (m[2] * 30 + m[1] * 59 + m[0] * 11 + 50) / 100; des.at<uchar>(r, c) = gray; } } } int main(int argc, char *argv[]) { cv::Mat src = cv::imread("../test1.jpg"); // 读取图片 cv::Mat gray; cv::Mat Mygray(src.rows, src.cols, CV_8UC1); cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY); // 调用内置函数 RGBToGray(src, Mygray); // 调用自定义函数 cv::imshow("src", src); // 显示原始图像 cv::imshow("gray", gray); // 显示使用内置函数转换后的灰度图像 cv::imshow("Mygray", Mygray); // 显示使用自定义函数转换后的灰度图像 cv::waitKey(0); return 0; } ``` 在上述代码中,`cv::cvtColor`函数是OpenCV提供的内置函数,用于颜色空间转换,`cv::COLOR_BGR2GRAY`表示将BGR格式的RGB图像转换灰度图像。同时,还自定义了`RGBToGray`函数手动实现转换,方便对比结果[^3][^5]。 ### 色彩空间转换模式 在OpenCV中,色彩空间转换模式用于指定不同类型的颜色空间转换。例如,`CV_BGR2GRAY`表示将RGB图像转换灰度图像,当使用该模式时,目标图像`dst`需要是单通道图片;`CV_BGR2HSV`将图片从RGB空间转换为HSV空间,对于8位图,需要将RGB值归一化到0 - 1之间,这样得到HSV图中的H范围才是0 - 360,S和V的范围是0 - 1[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值