为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像。24为彩色图像每个像素用3个字节表示,每个字节对应着RGB分量的亮度。

当RGB分量值不同时,表现为彩色图像;当RGB分量相同时,变现为灰度图像:

一般来说,转换公式有3中。

(1)Gray(i,j)=[R(i,j)+G(i,j)+B(i,j)]/3;

(2)Gray(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.144*B(i,j);

(3)Gray(i,j)=G(i,j);//从2可以看出G的分量比较大所以可以直接用它代替

下面是代码:

 #include<cv.h>
#include<highgui.h> using namespace cv;
using namespace std; int main()
{
IplImage *img=cvLoadImage("D:\\Opencv\\Images\\lena.jpg");
IplImage* dest=cvCreateImage(cvGetSize(img),img->depth,);
cvNamedWindow("SourceImage");
cvNamedWindow("destinationImage"); uchar* data=(uchar*)img->imageData; int step = img->widthStep/sizeof(uchar); //step即为上图的widthstep
int channels = img->nChannels; // 这个图片为3通道的
uchar b=,g=,r=;
for(int i=;i<img->height;i++)
for(int j=;j<img->width;j++){
b=data[i*step+j*channels+]; // 此时可以通过更改bgr的值达到访问效果。
g=data[i*step+j*channels+];
r=data[i*step+j*channels+];
// ((char*)(dest->imageData + j*dest->widthStep))[i] =(b+r+g)/3;//(1)
//((char*)(dest->imageData + j*dest->widthStep))[i] =r*0.299+g*0.587+0.144*b;//(2)
((char*)(dest->imageData + j*dest->widthStep))[i] =g;//(3)
} cvShowImage("SourceImage",img);
cvShowImage("destinationImage",dest);
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&img);
cvReleaseImage(&dest);
//i*step 当i=0 即为上图的第一行 为1就是第二行
//j*chanels+0 j*通道数当j=0为第一列的第0个通道->b
//j*channels+1 当j=1为第二列的第1个通道->g
}

原图片:

算法1生成的灰度图:

算法2生成的灰度图:

算法3生成的灰度图:

Opencv——彩色图像灰度化的三种算法的更多相关文章

  1. 最短路问题的三种算法&模板

    最短路算法&模板 最短路问题是图论的基础问题.本篇随笔就图论中最短路问题进行剖析,讲解常用的三种最短路算法:Floyd算法.Dijkstra算法及SPFA算法,并给出三种算法的模板.流畅阅读本 ...

  2. c语言求回文数的三种算法的描述

    c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...

  3. Java利用DES/3DES/AES这三种算法分别实现对称加密

    转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了 ...

  4. c#数字图像处理(二)彩色图像灰度化,灰度图像二值化

    为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上得到验证的算法,很容易移植到彩色图像上.24位彩色图像每个像素用3个字节表示,每个字节对应着R.G.B分量的亮度(红.绿 ...

  5. 内存分配---FF、BF、WF三种算法

    动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块 ...

  6. 图文实例解析,InnoDB 存储引擎中行锁的三种算法

    前文提到,对于 InnoDB 来说,随时都可以加锁(关于加锁的 SQL 语句这里就不说了,忘记的小伙伴可以翻一下上篇文章),但是并非随时都可以解锁.具体来说,InnoDB 采用的是两阶段锁定协议(tw ...

  7. RGB转灰度图的几种算法

    https://blog.csdn.net/cool1949/article/details/6649429 方法一:    对于彩色转灰度,有一个很著名的心理学公式: Gray = R*0.299 ...

  8. 常见算法:C语言求最小公倍数和最大公约数三种算法

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

  9. C语言求最小公倍数和最大公约数三种算法(经典)

    把以前写的一些经验总结汇个总,方便给未来的学弟学妹们做个参考! --------------------------永远爱你们的:Sakura 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们 ...

随机推荐

  1. asp.net(C#) 中 怎么使用 MongoDb

    1. 先引用以下Dll(如果找不到 到gethub上下载源代码自己编译 特别是MongoDB.Driver.Legacy.dll 我自己找了半天没找到): MongoDB.Bson.dll Mongo ...

  2. 做优步有什么旁门左道吗?No,贪小便宜会吃大亏!

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. Servlet+Tomcat 界面登录

    1.文件夹建立(必须按照这个规范,文件名和文件夹名必须一致) a.在%TOMCAT_HOME%\webapps下建立一个文件夹,取名MyWebsit b.在MyWebsit文件夹下新建WEB_INF文 ...

  4. Oracle- 日期加减

    加法 select sysdate,add_months(sysdate,12) from dual;        --加1年 select sysdate,add_months(sysdate,1 ...

  5. [置顶] MapReduce 编程之 倒排索引

    本文调试环境: ubuntu 10.04 , hadoop-1.0.2 hadoop装的是伪分布模式,就是只有一个节点,集namenode, datanode, jobtracker, tasktra ...

  6. PowerDesigner 物理数据模型(PDM)

    PowerDesigner 物理数据模型(PDM) 说明 数据库脚本sqldatabasegeneration存储   目录(?)[+]   一.     PDM 介绍 物理数据模型(Physical ...

  7. PJax在jQuery 3.0无法运行问题修复

    PJax在jQuery 3.0无法运行 [现象] 页面报错:Uncaught TypeError: Cannot read property 'push' of undefined [原因] jQue ...

  8. zoj 3820 Building Fire Stations 树的中心

    Building Fire Stations Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge ...

  9. PHP中的正则表达式函数preg_

    preg_match();     //用于正则表达式的匹配,且只匹配一次 preg_match_all();//用于正则表达式的匹配,会对所有符合规则的都进行匹配 preg_replace();   ...

  10. send,recv,sendto,recvfrom

    send函数 int send( SOCKET s,    const char FAR *buf,    int len,    int flags ); 不论是客户还是server应用程序都用se ...