以前实现RGB图像转换成灰度图像都是直接调用OpenCV的库函数RGB2GRAY(IplImage* src);最近老板让我们除了读入输出图像实时用OpenCV的函数,其余的最好都是自己写,所以我自己上网查了一些资料,得到了一些转换算法,并且用c语言实现,具体归纳下来有如下三种:

方法一.对于RGB转灰度,有一个很著名的心理公式:Gray = r*0.299 + g*0.587 + b*0.114;

方法二.Adobephotoshop的公式:Adobe RGB(1998)[gamma = 2.20], gray = (r^2.2 * 0.2973 + g^2.2 * 0.6274 + b^2.2 * 0.0753)^(1/2.2);

方法三.平均值:gray = (r + b + r) / 3;

具体代码如下:

/*****************************************************************************************************

*File name: RGB2Gray.cpp

*Author: source code by RamiYim

*Version: cs-hhu-cn0.0

*Date: 2014.11.13

*Description: read a RGB frame, change it to Gray.

*Others:

*Function List: main functions and its function

*History: ,<20141113>,,

******************************************************************************************************/

#include "RGB2Gray.h"

#include "cv.h"

#include "highgui.h"

#include "math.h"

#include

void RGB2GrayTypical(int sizeOfPixel, char *imageData);

void RGB2GrayInPhotoShop(int sizeOfPixel, char *imageData);

void RGB2GrayAverage(int sizeOfPixel, char *imageData);

char *gray;//用于存放转换后的灰度像素值

void main(){

IplImage *srcImage = cvLoadImage("D:\\testdata\\lena.jpg");

cvShowImage("srcImage", srcImage);

int width = srcImage->width;//图像宽度

int height = srcImage->height;//图像高度

int nChannels = srcImage->nChannels;//通道数

int sizeOfPixel = width * height;//像素数

IplImage *grayImage = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);//创建灰度图像

gray = (char *) malloc(sizeof(char) * width * height);//灰度图像的"imageData"初始化

RGB2GrayTypical(sizeOfPixel, srcImage->imageData);//转换成gray图像

grayImage->imageData = gray;

cvShowImage("grayImageTypical", grayImage);

RGB2GrayInPhotoShop(sizeOfPixel, srcImage->imageData);//转换成gray图像

grayImage->imageData = gray;

cvShowImage("RGB2GrayInPhotoShop", grayImage);

RGB2GrayAverage(sizeOfPixel, srcImage->imageData);

grayImage->imageData = gray;

cvShowImage("RGB2GrayAverage", grayImage);

cvWaitKey();

}

/******************************************************************************************************

*Function:RGB2GrayTypical()

*Description:输入一帧RGB图像,得到其灰度图像

*Calls://none

*Called by://main

*Input://none

*Output://none

*Return://void

*Others://算法思想:Gray = R*0.299 + G*0.587 + B*0.114

*History: ,<20141113>,,

******************************************************************************************************/

void RGB2GrayTypical(int sizeOfPixel, char *imageData){

for (int i = 0; i < sizeOfPixel; i++)

{

uchar b = (uchar)imageData[3 * i + 0];

uchar g = (uchar)imageData[3 * i + 1];

uchar r = (uchar)imageData[3 * i + 2];

gray[i] = r * 0.299 + g * 0.587 + b * 0.114;

}

}

/******************************************************************************************************

*Function:RGB2GrayInPhotoShop()

*Description:输入一帧RGB图像,得到其灰度图像

*Calls://none

*Called by://main

*Input://none

*Output://none

*Return://void

*Others://算法思想:Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2)

*History: ,<20141114>,,

******************************************************************************************************/

void RGB2GrayInPhotoShop(int sizeOfPixel, char *imageData){

for (int i = 0; i < sizeOfPixel; i++)

{

uchar b = imageData[3 * i + 0];

uchar g = imageData[3 * i + 1];

uchar r = imageData[3 * i + 2];

gray[i] = pow((pow(r, 2.2) * 0.2973 + pow(g, 2.2) * 0.6274 + pow(b, 2.2) * 0.0753), 1/2.2);

}

}

/******************************************************************************************************

*Function:RGB2GrayAverage()

*Description:输入一帧RGB图像,通过均值法得到其灰度图像

*Calls://none

*Called by://main

*Input://none

*Output://none

*Return://void

*Others://算法思想:gray = (r + g + b) / 3

*History: ,<20141114>,,

******************************************************************************************************/

void RGB2GrayAverage(int sizeOfPixel, char *imageData){

for (int i = 0; i < sizeOfPixel; i++)

{

uchar b = imageData[3 * i + 0];

uchar g = imageData[3 * i + 1];

uchar r = imageData[3 * i + 2];

gray[i] = (b + g + r) / 3;

}

}

输出结果如下:

C语言运行时变成灰色,C语言实现RGB图像转换成灰(Gray)度图像相关推荐

  1. c语言运行时内存不够,浅析C语言运行时内存管理

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 主要讨论C语言怎样组织正在运行的程序的数据结构的细节. 我们知道知道在UNIX操作系统中,一个C语言文件经过预处理(cp ...

  2. Go 语言运行时环境变量快速导览

    原文: http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables Go 语言运行时 ...

  3. c语言运行时隐藏dos窗口

    c语言运行时隐藏dos窗口 只要加一个这个语句就行了. #pragma comment(linker,"/subsystem:"windows" /entry:" ...

  4. Go 语言运行时环境变量快速

    Go 语言运行时环境变量快速导览 Go Runtime除了提供:GC, goroutine调度, 定时器,network polling等服务外, 还提供其它一些工具设施,用于开启额外的调试输出, 或 ...

  5. 对Eclipse OMR(用于创建语言运行时环境的工具集)架构师Mark Stoodley的访谈

    IBM的Eclipse OMR是一个开源的虚拟机工具集,用于创建任意语言的运行时环境.它的意图在于让实现语言的人能够重用IBM在Java运行时方面所投入的数百开发人年所取得的成果,能够受益的包含已有的 ...

  6. R语言使用magick包的image_animate函数和image_morph函数创建一个由n个图像组成的序列,逐渐将一个图像转换成另一个图像(sequence of image morph by)

    R语言使用magick包的image_animate函数和image_morph函数创建一个由n个图像组成的序列,逐渐将一个图像转换成另一个图像(Creates a sequence of n ima ...

  7. VFP在运行时扩展报表系统,这是报表转换任意格式的秘决

    VFP在运行时扩展报表系统,这是报表转换任意格式的秘决 译者:Fbilo.其实你只要掌握了VFP9的报表系统,你就可以开发出报表转任意的文件格式. 除了在第六章"在设计时扩展报表系统&quo ...

  8. C语言运行时数据结构

    段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...

  9. IBM推出创建语言运行时的工具包Eclipse OMR

    IBM创建了Eclipse OMR,一个用于为任何语言创建运行时环境的开源虚拟机工具包.OMR旨在让各种语言都能利用虚拟机技术的一般改进,像垃圾收集或硬件集成.为此,IBM正在推广自己名为J9的JVM ...

最新文章

  1. MVC防止CSRF攻击
  2. 成功解决AttributeError: module ‘seaborn‘ has no attribute ‘lvplot‘
  3. Windows8.1提升权限安装程序
  4. 通俗地讲清楚fit_transform()和transform()的区别
  5. 计算机系统基础:文件管理相关知识笔记
  6. “理了么”app使用体验
  7. 2018年4月10日--python解决乱码和作业
  8. nginx配置url重定向-反向代理
  9. mysql离线安装 window_5分钟完成mysql离线安装
  10. 2. Javascript 数据类型
  11. 机器学习-UCI数据集
  12. 【转•科普】为什么Nikola Tesla是迄今为止最伟大的极客(爱迪生啊爱迪生)
  13. MySQL的多表操作
  14. 交互设计如何为业务赋能——谈谈网易严选企业采购的主页设计
  15. 4.前端注册表单验证 表单回填
  16. kvm+webvirtmgr部署
  17. win32 透明窗口无边框模版
  18. 我竟然被淘口令骗了500大洋...
  19. 二手电商赛道龙头崛起,玩家们的较量依然是“长期战争”?
  20. C# 打印预览 PrintDocument打印、打印预览

热门文章

  1. 用jQuery添加dragstart,dragover和drop事件,实现拖拽效果
  2. word页眉页码目录
  3. Ubuntu7.10安装Antivir和dazuko纪实
  4. 如何快速实现一个基于Nginx网站的监控场景
  5. ios html5 拍照旋转,H5 解决ios拍照旋转90度
  6. hy-bridge:一款简洁安全可靠的Hybrid框架
  7. php单双引号嵌套解决方案
  8. 【题解】洛谷P6006 [USACO20JAN]Farmer John Solves 3SUM G
  9. 世界五百强中国上榜公司首次超过美国;现代汽车发布电动汽车品牌IONIQ | 美通企业日报...
  10. mark glossiness==1.0