为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像。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. Use ALTER DATABASE to Move Databases

    Use ALTER DATABASE to Move Databases Follow Our Daily Tips •facebook.com/TechNetTips• twitter.com/Te ...

  2. 32位Ubuntu12.04搭建Hadoop2.5.1完全分布式环境

    准备工作 1.准备安装环境: 4台PC,均安装32位Ubuntu12.04操作系统,统一用户名和密码 交换机1台 网线5根,4根分别用于PC与交换机相连,1根网线连接交换机和实验室网口 2.使用ifc ...

  3. Java深度遍历文件夹(递归实现)

    package FileDemo; import java.io.File; public class DeepSearchDir { /** * @param args */ public stat ...

  4. IAR 1.3 for STM8 ST-Link无法调试 无法仿真 the debugging session could not be started

    IAR 1.3 for STM8 ST-Link无法调试 the debugging session could not be started CPU型号是:STM8F103F3 首先要用ST Vis ...

  5. Oracle- 日期加减

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

  6. EntityFramework 连接数据库出错

    本文转载:http://www.cnblogs.com/shuang121/archive/2012/03/19/2406121.html 总结:选择“是”时,连接字符串的密码会暴露出来,“否”的时候 ...

  7. cocos2d-x 动画加速与减速

    转自:http://novacreo.com/%E7%A8%8B%E5%BA%8F%E7%BB%84/cocos2d-x%E5%8A%A8%E7%94%BB%E5%8A%A0%E9%80%9F%E4% ...

  8. SQL Server内存性能分析

    内存概念: Working Set = Private Bytes + Shared Memory Working Set:某个进程的地址空间中,存放在物理内存的那一部分 Private Bytes: ...

  9. sql函数:汉字转换为拼音

    sql数据库自定义一个函数把下面代码写进去 功能是得到汉字拼音首字母create function fun_getPY(@str nvarchar(4000)) returns nvarchar(40 ...

  10. [置顶] 最小生成树Prim算法

    二话不说直接贴代码 原图传送门:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/minispantree.asp 但是上面展现的是克鲁斯卡尔算法 ...