C语言运行时变成灰色,C语言实现RGB图像转换成灰(Gray)度图像
以前实现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)度图像相关推荐
- c语言运行时内存不够,浅析C语言运行时内存管理
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 主要讨论C语言怎样组织正在运行的程序的数据结构的细节. 我们知道知道在UNIX操作系统中,一个C语言文件经过预处理(cp ...
- Go 语言运行时环境变量快速导览
原文: http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables Go 语言运行时 ...
- c语言运行时隐藏dos窗口
c语言运行时隐藏dos窗口 只要加一个这个语句就行了. #pragma comment(linker,"/subsystem:"windows" /entry:" ...
- Go 语言运行时环境变量快速
Go 语言运行时环境变量快速导览 Go Runtime除了提供:GC, goroutine调度, 定时器,network polling等服务外, 还提供其它一些工具设施,用于开启额外的调试输出, 或 ...
- 对Eclipse OMR(用于创建语言运行时环境的工具集)架构师Mark Stoodley的访谈
IBM的Eclipse OMR是一个开源的虚拟机工具集,用于创建任意语言的运行时环境.它的意图在于让实现语言的人能够重用IBM在Java运行时方面所投入的数百开发人年所取得的成果,能够受益的包含已有的 ...
- 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 ...
- VFP在运行时扩展报表系统,这是报表转换任意格式的秘决
VFP在运行时扩展报表系统,这是报表转换任意格式的秘决 译者:Fbilo.其实你只要掌握了VFP9的报表系统,你就可以开发出报表转任意的文件格式. 除了在第六章"在设计时扩展报表系统&quo ...
- C语言运行时数据结构
段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...
- IBM推出创建语言运行时的工具包Eclipse OMR
IBM创建了Eclipse OMR,一个用于为任何语言创建运行时环境的开源虚拟机工具包.OMR旨在让各种语言都能利用虚拟机技术的一般改进,像垃圾收集或硬件集成.为此,IBM正在推广自己名为J9的JVM ...
最新文章
- MVC防止CSRF攻击
- 成功解决AttributeError: module ‘seaborn‘ has no attribute ‘lvplot‘
- Windows8.1提升权限安装程序
- 通俗地讲清楚fit_transform()和transform()的区别
- 计算机系统基础:文件管理相关知识笔记
- “理了么”app使用体验
- 2018年4月10日--python解决乱码和作业
- nginx配置url重定向-反向代理
- mysql离线安装 window_5分钟完成mysql离线安装
- 2. Javascript 数据类型
- 机器学习-UCI数据集
- 【转•科普】为什么Nikola Tesla是迄今为止最伟大的极客(爱迪生啊爱迪生)
- MySQL的多表操作
- 交互设计如何为业务赋能——谈谈网易严选企业采购的主页设计
- 4.前端注册表单验证 表单回填
- kvm+webvirtmgr部署
- win32 透明窗口无边框模版
- 我竟然被淘口令骗了500大洋...
- 二手电商赛道龙头崛起,玩家们的较量依然是“长期战争”?
- C# 打印预览 PrintDocument打印、打印预览
热门文章
- 用jQuery添加dragstart,dragover和drop事件,实现拖拽效果
- word页眉页码目录
- Ubuntu7.10安装Antivir和dazuko纪实
- 如何快速实现一个基于Nginx网站的监控场景
- ios html5 拍照旋转,H5 解决ios拍照旋转90度
- hy-bridge:一款简洁安全可靠的Hybrid框架
- php单双引号嵌套解决方案
- 【题解】洛谷P6006 [USACO20JAN]Farmer John Solves 3SUM G
- 世界五百强中国上榜公司首次超过美国;现代汽车发布电动汽车品牌IONIQ | 美通企业日报...
- mark glossiness==1.0