灰度图像
灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。
图像的灰度化一般作为图像的预处理步骤,为之后更复杂的图像处理做准备。另一方面,将图像灰度化也可以作为一个简常见的滤镜效果。
灰度化方法
一般将图像灰度化由分量法、最大值法、平均值发以及加权平均法4种。
![bowl-of-fruit-in-rain-4125348_640.jpg](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/2380746d787c4f141c1beedf957d7d30.jpg)
1-分量法
分量法是指将图像的三种分量的亮度值(灰度值)作为三个图像的灰度值的方法,可以根据需要选择应用哪一个分量产生的灰度图像。该方法的公式原理如下:
![分量法.png](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/e512b381c27b25754494ef8d18f09e34.png)
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// channel graying | 分量法
enum enumRGB { R = 1, G = 2, B = 3 };
cv::Mat channelGraying(cv::Mat src_image, enumRGB channel)
{
cv::Mat gray_image(src_image.size(), CV_8UC1);
switch (channel)
{
case R:
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = src_image.at<cv::Vec3b>(i, j)[2];
}
}
break;
case G:
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = src_image.at<cv::Vec3b>(i, j)[1];
}
}
case B:
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = src_image.at<cv::Vec3b>(i, j)[0];
}
}
break;
default:
assert(false);
break;
}
return gray_image;
}
|
运行代码效果
![分量法灰度化效果.png](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/fc59199884470197e2b978fef2365a81.png)
2-最大值法
最大值法为,选取三个分量中亮度值(灰度值)最大的作为灰度图像的灰度值。该方法公式原理如下:
![最大值法.png](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/db53cd3aa037616cef2b3e06a9d259f7.png)
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// max value graying | 最大值灰度化
cv::Mat maxValueGraying(cv::Mat src_image)
{
cv::Mat gray_image(src_image.size(), CV_8UC1);
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = std::max(
src_image.at<cv::Vec3b>(i, j)[0],
std::max(
src_image.at<cv::Vec3b>(i, j)[1],
src_image.at<cv::Vec3b>(i, j)[2]
)
);
}
}
return gray_image;
}
|
运行代码效果
![最大值法灰度化效果.png](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/5601c5a38940e2482171071f759122f1.png)
3-平均值法
平均值法为,将三个分量的灰度值求取平均值作为灰度图像的灰度值。该方法的公式原理为:
![平均值法.png](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/09c6cffbe7f33775700f1f2fc19a5c98.png)
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// average value garying | 平均值法
cv::Mat avergaeValueGraying(cv::Mat src_image)
{
cv::Mat gray_image(src_image.size(), CV_8UC1);
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = (src_image.at<cv::Vec3b>(i, j)[0] + src_image.at<cv::Vec3b>(i, j)[1] + src_image.at<cv::Vec3b>(i, j)[1]) / 3;
}
}
return gray_image;
}
|
![平均值法灰度化效果.png](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/06847e94a1c00296458d27f51670c1b1.png)
4-加权平均法
根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。
![加权平均法.png](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/cab86807b0a4734a9d7e03a1fbeb6689.png)
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// weighted average graying| 加权平均法
cv::Mat weightedAvergaeGraying(cv::Mat src_image)
{
cv::Mat gray_image(src_image.size(), CV_8UC1);
for (size_t i = 0; i < src_image.rows; i++)
{
for (size_t j = 0; j < src_image.cols; j++)
{
gray_image.at<uchar>(i, j) = 0.11 * src_image.at<cv::Vec3b>(i, j)[0] + 0.59*src_image.at<cv::Vec3b>(i, j)[1] + 0.30 * src_image.at<cv::Vec3b>(i, j)[2];
}
}
return gray_image;
}
|
![加权平均法灰度化效果.png](https://image.mangoeffect.net/mangoeffect-blog-image/2023/09/80f0852712fbcde57c0e364decd5af3c.png)
opencv灰度化图像方法
opencv实现图像的灰度化非常简单,有两种方法。
方法1,再读取图片的时候以灰度图像的方式读取图片
1
|
cv::Mat gray_image = cv::imread("test.jpg", 0)
|
方法2, 利用cvColor函数转换
1
2
|
cv::cvtColor(rgbMat, grayMat, CV_BGR2GRAY); //opencv2.x
cv::cvtColor(rgbMat, grayMat, COLOR_BGR2GRAY); //opencv3.x
|
本文由芒果浩明发布,转载请注明来源。
本文链接:https://blog.mangoeffect.net/opencv/image-graying-in-opencv.html
![微信公众号](https://image.mangoeffect.net/2023-12/%e8%ae%a2%e9%98%85%e5%8f%b7%e4%ba%8c%e7%bb%b4%e7%a0%81.png)