Opencv——彩色图像灰度化的三种算法

为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像。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的分量比较大所以可以直接用它代替

下面是代码:

 1 #include<cv.h>
 2 #include<highgui.h>
 3
 4 using namespace cv;
 5 using namespace std;
 6
 7 int main()
 8 {
 9     IplImage *img=cvLoadImage("D:\\Opencv\\Images\\lena.jpg");
10     IplImage* dest=cvCreateImage(cvGetSize(img),img->depth,1);
11     cvNamedWindow("SourceImage");
12     cvNamedWindow("destinationImage");
13
14     uchar* data=(uchar*)img->imageData;
15
16     int step = img->widthStep/sizeof(uchar);     //step即为上图的widthstep
17     int channels = img->nChannels;            // 这个图片为3通道的
18     uchar    b=0,g=0,r=0;
19     for(int i=0;i<img->height;i++)
20       for(int j=0;j<img->width;j++){
21            b=data[i*step+j*channels+0];   // 此时可以通过更改bgr的值达到访问效果。
22            g=data[i*step+j*channels+1];
23            r=data[i*step+j*channels+2];
24            // ((char*)(dest->imageData + j*dest->widthStep))[i] =(b+r+g)/3;//(1)
25            //((char*)(dest->imageData + j*dest->widthStep))[i] =r*0.299+g*0.587+0.144*b;//(2)
26            ((char*)(dest->imageData + j*dest->widthStep))[i] =g;//(3)
27       }
28
29       cvShowImage("SourceImage",img);
30       cvShowImage("destinationImage",dest);
31       cvWaitKey();
32       cvDestroyAllWindows();
33       cvReleaseImage(&img);
34       cvReleaseImage(&dest);
35     //i*step     当i=0 即为上图的第一行   为1就是第二行
36     //j*chanels+0  j*通道数当j=0为第一列的第0个通道->b
37     //j*channels+1         当j=1为第二列的第1个通道->g
38 }

原图片:

算法1生成的灰度图:

算法2生成的灰度图:

算法3生成的灰度图:

Opencv——彩色图像灰度化的三种算法,布布扣,bubuko.com

时间: 2024-10-12 11:44:55

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

最近公共祖先(三种算法)

最近研究了一下最近公共祖先算法,根据效率和实现方式不同可以分为基本算法.在线算法和离线算法.下面将结合hihocoder上的题目分别讲解这三种算法. 1.基本算法 对于最近公共祖先问题,最容易想到的算法就是从根开始遍历到两个查询的节点,然后记录下这两条路径,两条路径中距离根节点最远的节点就是所要求的公共祖先. 题目参见 #1062 : 最近公共祖先·一 附上AC代码,由于记录的方式采取的是儿子对应父亲,所以实现的时候有点小技巧,就是对第一个节点的路径进行标记,查找第二个节点的路径时一旦发现访问到

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

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了. 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂. 注意,这可不是我说的,是无数程序员总结的,话说的很实在也很精辟,若想长久可持续发展,多研究算法还是很有必要的,今天我给大家说说加密算法中的对称加密算法,并且这里将教会大家对称加密算法的编程使用.包含

快速排序、归并排序、堆排序三种算法性能比较

快速排序.归并排序.堆排序三种排序算法的性能谁最好呢?网上查了一下说快速排序最快.其次是归并排序,最差的是堆排序:而理论上三种排序算法的时间复杂度都是O(nlogn),只不过快速排序最差的会达到O(n^2),但是数据的随机性会消除这一影响,今天就来实际比较一下: 1 #include <iostream> 2 #include<time.h> 3 using namespace std; 4 #define MAX 100000000 5 int data1[MAX],data2[

字符串匹配的三种算法

下面将介绍三种有关字符串匹配的算法,一种是朴素的匹配算法,时间复杂度为O(mn),也就是暴力求解.这种方法比较简单,容易实现.一种是KMP算法,时间复杂度为O(m+n),该算法的主要任务是求模式串的next数组.另外还有一种对KMP算法的改进,主要是求nextval数组. 第一种朴素的匹配算法: int index(char str[], char subStr[]) { int i = 0, j = 0,index = 0; while (str[i] != '\0' && subStr

Java常用三种算法排序比较

Java常用三种算法排序比较 冒泡排序: package demo1; /** * * @author xiaoye 2014-5-13 */ /** * 有N 个数据需要排序,则从第0 个数开始,依次比较第0 和第1 个数据, * 如果第0 个大于第1 个则两者交换,否则什么动作都不做,继续比较第 1 个第2个-, * 这样依次类推,直至所有数据都"冒泡"到数据顶上. 冒泡排序的效率 O(N*N ),比较 N*N/2 ,交换N*N/4 . */ public class Bubble

缓存算法(FIFO 、LRU、LFU三种算法的区别)

缓存算法(FIFO .LRU.LFU三种算法的区别) FIFO算法# FIFO 算法是一种比较容易实现的算法.它的思想是先进先出(FIFO,队列),这是最简单.最公平的一种思想,即如果一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小.空间满的时候,最先进入的数据会被最早置换(淘汰)掉. FIFO 算法的描述:设计一种缓存结构,该结构在构造时确定大小,假设大小为 K,并有两个功能: set(key,value):将记录(key,value)插入该结构.当缓存满时,将最先进入缓存的数据置

字符串相似度三种算法介绍

余弦相似度 计算公式为: P(A,B) = sqrt(A × B) / (|A| × |B|) 设有两个字符串: ABCDEFG ABCHIJK 其中共有11个字符,为: A B C D E F G H I J K 如果,不考虑他们之间的关联性以及顺序等隐私,那么可以讲这两个字符串转换成两个11维空间中的向量: {1.1.1.1.1.1.1.0.0.0.0} {1.1.1.0.0.0.0.1.1.1.1} 那,计算他们之间的相似度为: P = sqrt(3) / (sqrt(7) × sqrt(

《网络流学习笔记02--Edmonds-Karp,Ford-Fulkerson,Dinic三种算法实现最大流》

[HDU3549]题目链接:click here 三种方法都用了一下,对比得出EK最少,只用46ms. [Edmonds-Karp算法] 基础的最大流算法,每次BFS寻找最短路进行增广,找出一条残余路径就可以了.然后对残余网络进行增广,不要忘记正向增广,相当于负向减少,也要在图中保存记录. 最后求一个割集来得到最大流,效率O(VE2),"找任意路径"最简单的方法是用DFS,但是数据要稍微增加就会变得较慢,采用BFS,源点和汇点保存在s和t中,净流量保存在变量f中. 代码: /*Edmo

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

动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块的数据结构.(2)内存块的描述. #define PROCESS_NAME_LEN 32 //进程名长度 #define MIN_SLICE 10 //最小碎片的大小 #define DEFAULT_MEM_SIZE 1024 //内存大小 #define DEFAULT_MEM_START 0 /