几种不同的彩色图像转灰度方法

最近在分析几个开源图像处理程序时,发现了几种不同的彩色图像转灰度方法,方法都很简单,也非常容易理解,但是效果还是有明显不同。在介绍计算方法前,先要说说亮度(lightness)与照度(luminosity)的区别。亮度(lightness),指的是人在看到光源时,眼睛感觉到的光亮度。照度(luminosity),指的是光源照射到物体上,单位被照射面积上的光通量。可以说,亮度是物体反射光到眼里的强弱,是人的一种主观感觉;而照度是光源照在物体上的强弱,是一种客观的物理量。同样的光源、同样的距离照在白纸和黑纸上,亮度不同,照度相同。下面是简单代码示例:

1. 基于均值的方法:

uchar *pSrcImg = src.data;
for (int i = 0; i < src.rows; i++)
{
	for (int j = 0; j < src.cols; j++, pSrcImg += 3)
	{
		double average = (pSrcImg[0] + pSrcImg[1] + pSrcImg[2]) / 3;
		pSrcImg[0] = (uchar)MIN(255, average);
		pSrcImg[1] = (uchar)MIN(255, average);
		pSrcImg[2] = (uchar)MIN(255, average);
	}
}

2. 基于亮度的方法:

uchar *pSrcImg = src.data;
for (int i = 0; i < src.rows; i++)
{
	for (int j = 0; j < src.cols; j++, pSrcImg += 3)
	{
		uchar max_val = MAX(pSrcImg[0], pSrcImg[1]);
		max_val = MAX(max_val, pSrcImg[2]);
		uchar min_val = MIN(pSrcImg[0], pSrcImg[1]);
		min_val = MIN(min_val, pSrcImg[2]);

		double lightness = (max_val + min_val) / 2;
		pSrcImg[0] = (uchar)MIN(255, lightness);
		pSrcImg[1] = (uchar)MIN(255, lightness);
		pSrcImg[2] = (uchar)MIN(255, lightness);
	}
}

3. 基于照度的方法:

// HDTV with BT.709
uchar *pSrcImg = src.data;
for (int i = 0; i < src.rows; i++)
{
	for (int j = 0; j < src.cols; j++, pSrcImg += 3)
	{
		double luminosity = pSrcImg[0] * 0.0722 + pSrcImg[1] * 0.7152 + pSrcImg[2] * 0.2126;
		pSrcImg[0] = (uchar)MIN(255, luminosity);
		pSrcImg[1] = (uchar)MIN(255, luminosity);
		pSrcImg[2] = (uchar)MIN(255, luminosity);
	}
}
// SDTV with BT.601
uchar *pSrcImg = src3.data;
for (int i = 0; i < src.rows; i++)
{
	for (int j = 0; j < src.cols; j++, pSrcImg += 3)
	{
		double luminosity = pSrcImg[0] * 0.114 + pSrcImg[1] * 0.587 + pSrcImg[2] * 0.299;
		pSrcImg[0] = (uchar)MIN(255, luminosity);
		pSrcImg[1] = (uchar)MIN(255, luminosity);
		pSrcImg[2] = (uchar)MIN(255, luminosity);
	}
}

下面是上述几种转换方法的效果图:

时间: 2024-10-13 00:43:05

几种不同的彩色图像转灰度方法的相关文章

(4)彩色图像转灰度图以及色调,饱和度等概念相关定义

以下关于定义的内容来自冈萨雷斯——<数字图像处理> RGB彩色模型:图像由三个分量图像组成,每种原色一副分量图像.当送入RGB监视器时,这三幅图像在屏幕上混合生成一副合成的彩色图像. HSI彩色模型:RGB模型的彩色系统对于硬件实现很理想,且与人眼强烈感知红.绿.蓝三原色的事实能很好的匹配.遗憾的是RGB模型和其它类似的彩色模型不能很好的适应实际上人解释的颜色(1).人观察一个彩色物体时,我们用其色调.饱和度和亮度来描述它,这就是HSI彩色模型. (1)原因与人眼中感光细胞对各种原色光的敏感度

unity中三种调用其他脚本函数的方法

第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数 第三种,GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数 unity中三种调用其他脚本函数的

几种更新(Update语句)查询的方法

正 文: 数据库更新就一种方法Update,其标准格式:Update 表名 set 字段=值 where 条件只是依据数据的来源不同,还是有所差别的:  1.从外部输入这样的比較简单例:update tb set UserName="XXXXX" where UserID="aasdd" 2.一些内部变量,函数等,比方时间等直接将函数赋值给字段update tb set LastDate=date() where UserID="aasdd" 3

linux几种快速清空文件内容的方法

linux几种快速清空文件内容的方法 几种快速清空文件内容的方法: $ : > filename #其中的 : 是一个占位符, 不产生任何输出. $ > filename $ echo "" > filename $ echo /dev/null > filename $ echo > filename $ cat /dev/null > filename

【转】寻求一种更好的软件工程研究方法

Mary Shaw 寻求一种更好的软件工程研究方法 Mary Shaw School of Computer Science, Carnegie Mellon University 摘要关于对物理学,生物学和医学的研究过程,人们早已有了公开的精准的解释.即便是在形式上看似简单,但这个领域的内和外也算提供了有价值的“高水准研究”的指导.但是软件工程就不同了,人们至今尚未明确找到并解释如何研究以及用何种方法去进行研究??.(方法论也是顶层设计,只有找到了高屋建瓴的研究方法,才能推动这个行业的进步.本

Colours–颜色库,包含100种预定义的颜色和方法

简介 Colours–颜色库,包含各种100种预定义的颜色和方法,可以简化颜色相关的开发工作. 项目主页: Colours 最新示例: 点击下载 快速入门 安装 通过Cocoapods安装 pod 'Colours' 手动安装 把 Colours.h 和 Colours.m拖进你的工程里,在需要的地方引入头文件即可: #import "Colours.h" 使用 调色板,一组预定义的颜色 具体可点击这里查看: 100个预定义的颜色 使用预定义的颜色 Colours 预定义了100 多种

[转]SQL三种获取自增长的ID方法

SQL SERVER中的三种获得自增长ID的方法  这个功能比较常用,所以记下来以防自己忘掉. SCOPE_IDENTITY 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个作用域就是一个模块--存储过程.触发器.函数或批处理.因此,如果两个语句处于同一个存储过程.函数或批处理中,则它们位于相同的作用域中. IDENT_CURRENT  返回为任何会话和任何作用域中的指定表最后生成的标识值.这个函数需要一个以表名为值的变量,也就是说虽然不受会话和作用域的限制

一种简单实用的全屏方法

实现程序全屏幕显示的思路有很多种,最常见的一种就是: 1)利用Windows API提供的一个结构体WINDOWPLACEMENT来存储全屏显示前视图和主框架窗口在屏幕上的位置和显示信息.非客户区窗口的显隐信息,以便全屏幕显示时恢复窗口原状: 2)通过API函数GetDesktopWindow()得到桌面窗口,由GetWindowRect()得到显示器的尺寸: 3)通过AdjustWindowRect()来计算当客户区大小为屏幕大小时相应的窗口大小: 4)通过SetWindowPlacement

一种简单快速的模板解析方法,活用with javascript版

//一种简单快速的模板解析方法,活用with var parseTpl = function( str, data ) { var tmpl = 'var __p=[];' + 'with(obj||{}){__p.push(\'' + str.replace( /\\/g, '\\\\' ) .replace( /'/g, '\\\'' ) .replace( /<%=([\s\S]+?)%>/g, function( match, code ) { return '\',' + code.