为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像。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. leetcode@ [295]Find Median from Data Stream

    https://leetcode.com/problems/find-median-from-data-stream/ Median is the middle value in an ordered ...

  2. kvm usb

  3. linux C编程之makefile

    目的:       基本掌握了 make 的用法,能在Linux系统上编程.环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备:      ...

  4. Java HashMap实例源码分析

    引言 HashMap在键值对存储中被经常使用,那么它到底是如何实现键值存储的呢? 一 Entry Entry是Map接口中的一个内部接口,它是实现键值对存储关键.在HashMap中,有Entry的实现 ...

  5. [OC Foundation框架 - 7] NSArray的创建与遍历

    NSArray是不可变的,不能先创建再添加元素 NSArray可以放入任何OC对象,但不能放入基本数据类型.结构体.枚举等非OC对象 不能存储nil   A.常用方法1 创建 返回用量 是否含有某元素 ...

  6. 转载 SharePoint【Site Definition 系列】– 创建Content Type

    转载原地址:  http://www.cnblogs.com/wsdj-ITtech/archive/2012/09/01/2470274.html Sharepoint本身就是一个丰富的大容器,里面 ...

  7. [置顶] Effective STL 学习笔记

    看Effective STL 作的一些笔记,希望对各位有帮助. 以下是50条条款及相关解释. 容器 1. 慎重选择容器类型,根据需要选择高效的容器类型. 2. 不要试图编写独立于容器类型的代码. 3. ...

  8. jquery判断input值不为空 val()

    <input type="text" class="searchbox" /> <script type='text/javascript'& ...

  9. 安卓Android控件ListView获取item中EditText值

    可以明确,现在没有直接方法可以获得ListView中每一行EditText的值. 解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值. 大概算法:重写Ba ...

  10. Linux curl命令详解

    用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...