S0.2 灰度图
灰度图定义
对于单色(灰度)图像而言,每个像素的亮度用一个数值来表示,通常数值范围在0到255之间,0表示黑、255表示白,其它值表示处于黑白之间的灰度。
灰度图优点
我们在进行很多图像的操作时,如果是彩色的 256 色图,由于图象处理后有可能会产生不属于这 256 种颜色的新颜色。
RGB转灰度算法(OpenCV3)
量化
我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)组合而成。有的颜色有红色成分多一些,如深红;有的有红色成分少一些,如浅红。针对有红色成分的多少,可以分成 0 到 255 共 256 个等级,0 级表示不含红色成分;255 级表示 有 100%的红色成分。 同样,绿色和蓝色也被分成 256 级。这种分级概念称为量化。
算法公式
灰度图是指只含亮度信息,不含色彩信息的图象,就象我们平时看到的黑白照片:亮度由暗到明,变化是连续的。因此,要表示灰度图,就需要把亮度值进行量化。通常划分成0到255共256个级别,其中0最暗(全黑),255最亮(全白)。在表示颜色的方法中,除了RGB外,还有一种叫YUV的表示方法,应用也很多。电视信号中用的就是一种类似于YUV的颜色表示方法。在这种表示方法中,Y分量的物理含义就是亮度,Y分量包含了灰度图的所有信息,只用Y分量就能完全能够表示出一幅灰度图来。
从 RGB 到 YUV 空间的 Y 转换,有一个很著名的心理学公式:
Y = R*0.299 + G*0.587 + B*0.114
我们进行优化变为整数算法:
Y = (R*299 + G*587 + B*114 + 500) / 1000
(当然,聪明的你们一定也想到了另一种方法就是,灰度值为(r+g+b)/3,之后你们可以看看两种方法的效果。)
OpenCV3代码:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void main()
{
Mat srcImage = imread("Lena.jpg");
Mat dstImage;
dstImage = srcImage.clone();
int rowNumber = srcImage.rows;
int colNumber = srcImage.cols * srcImage.channels();
imshow("old", srcImage);
for (int i = 0; i < rowNumber; i++)
{
uchar* data = dstImage.ptr<uchar>(i);
for (int j = 0; j < colNumber; j+=3)
{
data[j] =(data[j] * 299 + data[j + 1] * 587 + data[j + 2] * 114 + 500) / 1000;
//data[j] =(data[j] + data[j + 1] + data[j + 2]) / 3;
data[j + 1] = data[j+2] = data[j];
}
}
imshow("new", dstImage);
waitKey(0);
}
效果图:

OpenCV自带函数实现
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("images/Lena.jpg");
Mat dstImage1 = imread("images/Lena.jpg", 0);//法一
Mat dstImage2;
cvtColor(srcImage, dstImage2, CV_RGB2GRAY);//把图片转化为灰度图,法二
imshow("old", srcImage);
imshow("new1", dstImage1);
imshow("new2", dstImage2);
waitKey(10000);
return 0;
}
综合比较
我们把几种方法都写在一个程序里,看看效果
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("images/favorite/Lena.jpg");
Mat srcImage2 = imread("images/favorite/Lena.jpg", 0);
Mat dstImage,dstImage2;
dstImage = srcImage.clone();
dstImage2 = srcImage.clone();
int rowNumber = srcImage.rows;
int colNumber = srcImage.cols * srcImage.channels();
imshow("old", srcImage);
for (int i = 0; i < rowNumber; i++)
{
uchar* data = dstImage.ptr<uchar>(i);
for (int j = 0; j < colNumber; j+=3)
{
data[j] =(data[j] * 299 + data[j + 1] * 587 + data[j + 2] * 114 + 500) / 1000;
data[j + 1] = data[j+2] = data[j];
}
}
imshow("new", dstImage);
for (int i = 0; i < rowNumber; i++)
{
uchar* data = dstImage2.ptr<uchar>(i);
for (int j = 0; j < colNumber; j+=3)
{
data[j] =(data[j] + data[j + 1] + data[j + 2]) / 3;
data[j + 1] = data[j+2] = data[j];
}
}
imshow("new2", dstImage2);
imshow("new3", srcImage2);
waitKey(20000);
return 0;
}
效果如下:

显然,我们的心理学公式灰化的Lena(图new)是最好看的,头发细节比较清楚。而自带函数产生的(new3)和我们取rgb平均值产生的(new2)差不多。
S0.2 灰度图的更多相关文章
- C#机器视觉入门系列1-转化为灰度图&&3*3模糊
这是我入门机器视觉的系列学习经验之开篇,本来想着依靠opencv快速实现一些功能,但是想了一下既然是学数学的,还是应该自己多算算,写一些自己理解的东西才好. 入门篇很简单,就只是实现了转化成灰度图以及 ...
- Android-将RGB彩色图转换为灰度图
package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...
- QImage Color Convert to Gray 转为灰度图
在Qt中,我们有时需要把QImage类的彩色图片转为灰度图,一开始我想的是用QImage的成员函数convertToFormat(),但是试了好多参数,返现转化的图片都有问题,不是我们想要的灰度图,如 ...
- 怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?
分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.b ...
- 【python】RGB图片到灰度图的转换
在做立体匹配求深度图的时候遇到这个问题,用惯了matlab的rgb2gray,倒是不熟悉python的实现,在网上找到了相关方案,记下来已作备用 RGB到灰度图转换公式: Y' = 0.299 R + ...
- caffe matlab 借口怎么提取灰度图的 feature ? What happened if I mixed the color images with gray images together for training ?
1. caffe matlab 接口提供了提取feature的脚本,但是由于中间要对这些图像进行RGB ---> BGR 的变换,卧槽,灰度图没有三通道啊?怎么破?从上午就在纠结怎么会跑着跑着程 ...
- 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中
//从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...
- cocos2dx shader实现灰度图android后台切换回来导致图像偏移的问题
转自:http://www.tuicool.com/articles/U3URRrI 项目中经常会遇到将一张图像处理成灰色的需求,为了节省资源,一般不会让美术再做一套同样的灰度图,通常会通过代码处理让 ...
- 8位灰度图在LCD上显示
一.概述 1.灰度 灰度使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像.每个灰度对象都具有从 0%(白色)到灰度条100%(黑色)的亮度值. 使用黑白或灰度扫描仪生成的图像通常以灰 ...
随机推荐
- Flask进阶
Threading.local 作用:为每个线程创建一个独立的空间,使得线程对自己的空间中的数据进行操作(数据隔离). 应用: flask上下文管理中的local中比这更高级,为协程. DBUtils ...
- Quartz.net 3.x使用总结(二)——Db持久化和集群
上一篇简单介绍了Quartz.net的概念和基本用法,这一篇记录一下Quartz.net通过数据库持久化Trigger和Jobs等数据,并简单配置Quartz.net的集群. 1.JobStore介绍 ...
- 队列优化的dijkstra
#include<iostream> #include<queue> #include<cstdio> #include<cstring> #inclu ...
- JAVA IO练习
停车场有进场和出场的功能1. 进场时:采用键盘录入的方式,录入汽车的品牌.颜色.车牌号. 把品牌.颜色.车牌号,以及进场时间写入car.txt文件中. 2. 出场时:键盘录入车牌号,去文件中查找该车 ...
- CSS基础选择器(选择器的优先级),CSS样式块( 长度/颜色/显示方式/文本样式),盒模型组成,盒模型-block,盒模型布局
CSS基础选择器 (1)id选择器: # => 标签拥有 id="user" 属性 <style> #user { width: 200px; ...
- jQuery提示组件toastr(取代alert)
给大家推荐一款jquery提示插件:toastr 它是一个可以取代alert的提示信息框,它在PC,移动设备上都有不错的UI效果. 具体使用方法如下: 1.首先在网页头站调用他需要的js和css文件. ...
- MySQL学习5 - 数据类型二.md
一 字符类型 二 枚举类型和集合类型 一 字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的 ...
- Stm32复习之时钟系统
地点:南图 这部分的内容是整个STM32学习知识的核心,不管是什么微控制器处理器,时钟系统都是其核心类似于人之心脏,因此学好理解这一章节至关重要. 为了便于理解这一系统,将从以下几个层次来讲.(忘了是 ...
- PostgreSQL快速入门
一.PostgreSQL是什么? PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQ ...
- ansible 使用记录
copy: ansible server -m copy -a 'src=/etc/ansible/port/iptables dest=/etc/sysconfig/iptables owner=r ...