没有合适的资源?快使用搜索试试~ 我知道了~
方法1:灰度化后的R=(处理前的R + 处理前的G +处理前的B)/ 3灰度化后的G=(处理前的R + 处理前的G +处理前的B)/ 3灰度化后的B=(处理前的
资源详情
资源评论
资源推荐
1. 图像二值化
图像处理基本概念
像素点是最小的图像单元,一张图片由好多的像素点构成。
一张图片如果尺寸是 800 * 800 的,宽度是 800 像素,高度是 800 像素。也
就是说这张图片是由一个 800 * 800 的像素点矩阵构成的,这个矩阵是 800 行,800
列,像素是图像的最小单元,这张图片的宽度是 800 个像素点的长度,高度是 800
个像素点的长度,共有 800 * 800 = 640000 个像素点。
因为一个像素点的颜色是由 RGB 三个值来表现的,所以一个像素点矩阵对应
三个颜色向量矩阵,分别是 R 矩阵,G 矩阵,B 矩阵,它们也都是 800 *800 大小
的矩阵。下面展示某图片的一部分颜色矩阵数据:
这个是 R 矩阵中的一部分
这个是 G 矩阵中的一部分
图像中的噪声点
图像中噪声是指由于成像传感器噪声、相片颗粒噪声、图片在传输过程中的
通道传输误差等因素会使图片上出现一些随机的、离散的、孤立的像素点,这就
是图像噪声。图像噪声在视觉上通常与它们相邻的像素明显不同,例如黑区域中
的白点、白区域中的黑点等。
如何改变像素点的颜色:
在理解了一张图片是由一个像素点矩阵构成之后,我们就知道我们对图像的
处理就是对这个像素点矩阵的操作,想要改变某个像素点的颜色,我们只要在这
个像素点矩阵中找到这个像素点的位置,比如第 x 行,第 y 列,所以这个像素点
在这个像素点矩阵中的位置就可以表示成(x,y),因为一个像素点的颜色由红、
绿、蓝三个颜色变量表示,所以我们通过给这三个变量赋值,来改变这个像素点
的颜色,比如改成红色(255,0,0),可以表示为(x,y,(R=255,G=0,
B=0))。
单通道图像和三通道
(一):单通道图,
俗称灰度图,每个像素点只能有有一个值表示颜色,它的像素值在 0 到 255
之间,0 是黑色,255 是白色,中间值是一些不同等级的灰色。(也有 3 通道的灰
度图,3 通道灰度图只有一个通道有值,其他两个通道的值都是零)。
(二):三通道图,每个像素点都有 3 个值表示
,所以就是 3 通道。也有 4 通道的图。例如 RGB 图片即为三通道图片,RGB
色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通
道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红、
绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是
目前运用最广的颜色系统之一。总之,每一个点由三个值表示。
在我的教程 Mat -
基本图像容器
中,你或许已了解到,图像矩阵的大小取决于
我们所用的颜色模型,确切地说,取决于所用通道数。如果是灰度图像,矩阵就
会像这样:
而对多通道图像来说,矩阵中的列会包含多个子列,其子列个数与通道数相等。
例如,RGB 颜色模型的矩阵:
注意到,子列的通道顺序是反过来的:BGR 而不是 RGB。很多情况下,因为
内存足够大,可实现连续存储,因此,图像中的各行就能一行一行地连接起来,
形成一个长行。
图片的灰度化
就是让像素点矩阵中的每一个像素点都满足下面的关系:R=G=B。
灰度处理的方法:
一般灰度处理经常使用下面两种计算公式来进行处理。
方法 1:
灰度化后的 R=(处理前的 R + 处理前的 G +处理前的 B)/ 3
灰度化后的 G=(处理前的 R + 处理前的 G +处理前的 B)/ 3
灰度化后的 B=(处理前的 R + 处理前的 G +处理前的 B)/ 3
方法 2:
灰度化后的 R = 处理前的 R * 0.3+ 处理前的 G * 0.59 +处理前的 B *
0.11
灰度化后的 G = 处理前的 R * 0.3+ 处理前的 G * 0.59 +处理前的 B * 0.11
灰度化后的 B = 处理前的 R * 0.3+ 处理前的 G * 0.59 +处理前的 B * 0.11
注意:第二种方法更好。
//******************灰度转换函数*************************
//第一个参数 image 输入的彩色 RGB 图像;
//第二个参数 imageGray 是转换后输出的灰度图像;
//*************************************************************
void ConvertRGB2GRAY(const Mat &image,Mat &imageGray)
{
if(!image.data||image.channels()!=3)
{
return ;
}
imageGray=Mat::zeros(image.size(),CV_8UC1);
uchar *pointImage=image.data;
uchar *pointImageGray=imageGray.data;
int stepImage=image.step;
int stepImageGray=imageGray.step;
for(int i=0;i<imageGray.rows;i++)
{
for(int j=0;j<imageGray.cols;j++)
{
pointImageGray[i*stepImageGray+j]=0.114*pointImage[i*stepImage+3*
j]+0.587*pointImage[i*stepImage+3*j+1]+0.299*pointImage[i*stepImage+3
*j+2];
}
剩余20页未读,继续阅读
StoneChan
- 粉丝: 27
- 资源: 321
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0