opencv彩色图像(RGB)转灰度图像及其优化
来源:互联网 发布:2017软件测评师真题 编辑:程序博客网 时间:2024/06/05 22:58
1. 彩色图像转灰度图像
RGB转灰度,通常会使用下面的一个心理学公式:(Matlab和OpenCV中使用的也是该公式)
Gray = 0.2989*R + 0.5870*G + 0.1140*B
实现代码如下
#include<opencv.hpp>//通过上述计算公式得到灰度图像
void grayImageShow(cv::Mat &input, cv::Mat &output){for (int i = 0; i < input.rows; ++i){for (int j = 0; j < input.cols; ++j){output.at<uchar>(i, j) = cv::saturate_cast<uchar>(0.114*input.at<cv::Vec3b>(i, j)[0] + 0.587*input.at<cv::Vec3b>(i, j)[1] + 0.2989*input.at<cv::Vec3b>(i, j)[2]);}}cv::imshow("dst", output);}int main(void){cv::Mat src, gray, dst;gray=cv::imread("d:/Opencv Picture/Lena.jpg", cv::IMREAD_GRAYSCALE);//由imread()得到的灰度图像src = cv::imread("d:/Opencv Picture/Lena.jpg");dst.create(src.rows, src.cols,CV_8UC1);cv::imshow("scr",src);cv::imshow("gray", gray);grayImageShow(src, dst);cvWaitKey(0);return 0;}下面是输出结果,src为原图像,gray为通过imread()获得的灰度图,dst为通过计算公式得到的灰度图
2. 计算速度优化
抛却指令优化不谈,优化转化速度的最直接方法就是将浮点运算转化为整数运算:
比如我们可以将上式转化为:
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++ 程序也比较简单:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
更多精度转换,大家也可以参照下表:
阅读全文
0 0
- opencv彩色图像(RGB)转灰度图像及其优化
- 彩色RGB图像转为灰度图像
- OpenCV彩色图像转灰度图
- C++ OpenCV 实现RGB彩色图像转化成灰度图像再转换成二值图像
- 【拜小白opencv】2图像彩色空间转换,RGB转灰度图等。cvtColor()函数
- 彩色图像转灰度图像
- 【Android】使用OpenCV彩色图像转灰度图像
- openCV彩色图像转换为灰度图像
- opencv彩色图像与灰度图像叠加
- RGB彩色图像灰度化经验公式
- RGB转灰度图像
- RGB彩色图像与灰度图像转换 opencv实现 代码及分析
- 彩色图像->灰度图像:
- 灰度图像彩色图像
- 彩色图像RGB通道分别读到三个灰度图像
- 【Java Opencv系列】5.1彩色图像转灰度
- 彩色图像转灰度图
- 灰度图像转伪彩色
- Mysql数据乱码完美解答
- Python :删除链表中重复的节点
- win32(7)--文件操作
- java语言基础(68)——集合框架(泛型概述和使用)
- 《Unix环境高级编程》 总结 (一)
- opencv彩色图像(RGB)转灰度图像及其优化
- P1186 玛丽卡
- Python :从尾到头打印链表
- Bayes 分类算法
- Python学习06-文件I/O
- 带你领略Linux系统发展及版本更迭
- JavaScript循环刷新页面
- 【bzoj3132】上帝造题的七分钟
- C++实现RSA加密解密