博客
关于我
色彩转换系列之RGB图转灰度图原理及实现
阅读量:798 次
发布时间:2023-04-15

本文共 2072 字,大约阅读时间需要 6 分钟。

在图像处理中,彩色图转灰度图的应用非常广泛。许多算法仅对灰度图有效,因此将彩色图转换为灰度图是一个关键步骤。

RGB(红绿蓝)是基于人眼识别的颜色定义,能够表示大部分颜色。然而,在科学研究中,RGB并不常用,因为其三个维度(色调、亮度、饱和度)难以分开处理。RGB模型是最通用的面向硬件的彩色模型,广泛应用于彩色监视器和视频摄像机。

RGB颜色空间

RGB颜色空间基于颜色的加法混色原理。从黑色开始,逐渐叠加红色、绿色和蓝色,最终可以得到白色光。这种空间可以用笛卡尔坐标系表示,通过R、G、B三个通道作为X、Y、Z轴。

RGB转灰度图

将彩色图转灰度图的核心公式是:

Gray = R0.299 + G0.587 + B*0.114
直接计算会涉及浮点型运算,速度较慢。因此,优化算法将小数转为整数,通过移位运算提高效率。以下是不同精度(2-20位)的优化公式:

  • 2Grey = (R1 + G2 + B*1) >> 2
  • 3Grey = (R2 + G5 + B*1) >> 3
  • 4Grey = (R4 + G10 + B*2) >> 4
  • ...
  • 20Grey = (R313524 + G615514 + B*119538) >> 20

这些公式通过整数计算减少了计算复杂度,但需要权衡精度损失。

实现

#include 
#include
#include
#include
using namespace cv;Mat RGB2GRAY(Mat src, bool accelerate) { CV_Assert(src.channels() == 3); Mat dst = Mat::zeros(src.size(), CV_8UC1); Vec3b rgb; int r = src.rows, c = src.cols; for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { rgb = src.at
(i, j); uchar B = rgb[0], G = rgb[1], R = rgb[2]; if (!accelerate) { dst.at
(i, j) = R*0.299 + G*0.587 + B*0.114; } else { dst.at
(i, j) = (R*4898 + G*9618 + B*1868) >> 14; } } } return dst;}int main() { Mat src = imread("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Img\\lena.jpg"); if (src.empty()) { return -1; } Mat dst, dst1; double t2 = getTickCount(); cvtColor(src, dst1, CV_RGB2GRAY); t2 = getTickCount() - t2; double time2 = (t2 * 1000.) / getTickFrequency(); cout << "Opencv_rgb2gray=" << time2 << " ms. " << endl << endl; double t1 = getTickCount(); dst = RGB2GRAY(src, true); t1 = getTickCount() - t1; double time1 = (t1 * 1000.) / getTickFrequency(); cout << "My_rgb2gray=" << time1 << " ms. " << endl << endl; namedWindow("src", CV_WINDOW_NORMAL); imshow("src", src); namedWindow("My_rgb2gray", CV_WINDOW_NORMAL); imshow("My_rgb2gray", dst); namedWindow("Opencv_rgb2gray", CV_WINDOW_NORMAL); imshow("Opencv_rgb2gray", dst1); waitKey(0); return 0;}

效果

通过优化算法,实现的RGB转灰度图速度显著提高。与OpenCV的原生函数相比,性能提升了近30%。以下是实际效果:

转载地址:http://awgfk.baihongyu.com/

你可能感兴趣的文章
Mysql 自定义函数
查看>>
mysql 行转列 列转行
查看>>
Mysql 表分区
查看>>
mysql 表的操作
查看>>
mysql 视图,视图更新删除
查看>>
MySQL 触发器
查看>>
mysql 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
查看>>