赞
踩
灰度图是一种只包含灰度信息(亮度信息)而不包含彩色信息的图像。在灰度图中,每个像素的亮度值表示图像中对应位置的亮度级别,通常用 0 到 255 之间的整数值表示,0 表示黑色,255 表示白色,中间的值表示不同程度的灰度。
灰度图是由彩色图像经过灰度化处理得到的,灰度化处理是将彩色图像的 RGB(红绿蓝)三个通道的颜色值转换为单一的灰度值的过程。常见的灰度化方法包括将 RGB 三个通道的像素值按照一定的权重进行加权平均,或者采用其他算法,如最大值法、最小值法等。
灰度图常用于图像处理、计算机视觉、模式识别等领域。与彩色图像相比,灰度图具有更低的存储空间和处理复杂度,因此在一些应用中更加高效。例如,人脸识别、图像检索、医学图像分析等领域常常使用灰度图来简化图像处理过程。
使用灰度图有几个重要的原因:
简化处理:灰度图仅包含亮度信息,相比彩色图像,其数据量更小,处理起来更加简单和高效。这使得在一些应用中,如图像处理、模式识别、计算机视觉等,可以节省计算资源和时间。
降低复杂性:灰度图消除了彩色信息,使图像更加简洁,更容易理解和分析。在一些应用中,如医学图像分析、地质图像分析等领域,灰度图可以使得图像的特征更加明显,更容易被专业人员识别和分析。
增强对比度:在某些情况下,灰度图比彩色图更容易展示图像的细节和结构,因为彩色信息可能会分散注意力,而灰度图则能够集中观察者的注意力于图像的亮度变化和纹理细节上。
适应特定应用:有些应用只需要图像中的亮度信息而不需要彩色信息,例如,自动识别、人脸识别、目标检测等应用可以在灰度图上更有效地进行,因为亮度信息往往是决定图像中对象特征的关键因素。
减少数据存储和传输开销:由于灰度图的数据量比彩色图小很多,因此在存储和传输方面具有更高的效率,尤其是在需要大量图像数据的场景中,如视频流传输、图像数据存档等。
灰度图像的生成通常通过将彩色图像的 RGB(红绿蓝)三个通道的像素值转换为单一的灰度值。有几种常用的灰度化方法,其中最常见的一种是将 RGB 三个通道的像素值按照一定的权重进行加权平均。一个常用的灰度化公式是加权平均法:
其中,R,G,B 分别表示彩色图像的红色、绿色和蓝色通道的像素值,Y 表示生成的灰度图像的像素值。
在这个公式中,红色通道的权重是 0.299,绿色通道的权重是 0.587,蓝色通道的权重是 0.114。这些权重是根据人眼对不同颜色的敏感度而选择的,它们使得生成的灰度图像更加符合人眼的感知。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import os
# 获取当前脚本所在目录
current_file_dir = os.path.dirname(os.path.abspath(__file__))
# 图片文件路径
img_path = os.path.join(current_file_dir, 'Lena.jpg')
# 读取图像
img = mpimg.imread(img_path)
# 提取图像尺寸
rows, cols, _ = img.shape
# 创建灰度图像数组
gray_img = [[0 for _ in range(cols)] for _ in range(rows)]
# 计算灰度值
for i in range(rows):
for j in range(cols):
r, g, b = img[i, j]
gray_img[i][j] = 0.299 * r + 0.587 * g + 0.114 * b
# 显示原始图像
plt.figure()
plt.imshow(img)
plt.title('Original Image')
plt.axis('off')
# 显示灰度图像
plt.figure()
plt.imshow(gray_img, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')
# 显示图像
plt.show()
这个代码片段会读取名为 Lena.jpg 的图片,将其转换为灰度图,并显示原始图像以及转换后的灰度图像。
在powershell中输入如下命令,需指定rgb2gray.py的绝对路径。
[登录可见]隐藏内容 - 作者可见
% 图片文件路径
img_path = 'Lena.jpg';
% 读取图像
img = imread(img_path);
% 提取图像尺寸
[rows, cols, ~] = size(img);
% 创建灰度图像数组
gray_img = zeros(rows, cols);
% 计算灰度值
for i = 1:rows
for j = 1:cols
r = double(img(i, j, 1));
g = double(img(i, j, 2));
b = double(img(i, j, 3));
gray_img(i, j) = 0.299 * r + 0.587 * g + 0.114 * b;
end
end
% 显示原始图像
figure;
imshow(img);
title('Original Image');
axis off;
% 显示灰度图像
figure;
imshow(gray_img, []);
title('Grayscale Image');
axis off;
% 该 MATLAB 代码实现了将彩色图像转换为灰度图像的功能,并显示原始图像和灰度图像。
% 函数 rgb_to_gray 接受一个 RGB 图像作为输入,并返回一个灰度图像。
% 图像的灰度值计算公式为:gray = 0.299 * R + 0.587 * G + 0.114 * B。
% 图片文件路径由变量 img_path 指定。
% 该代码使用基本的 MATLAB 循环结构逐像素计算灰度值,以实现与给定的 Python 代码相同的功能。
% 显示原始图像和灰度图像时,使用 imshow 函数,并在标题中指定图像类型。
matlab运行脚本时会出现类似下图的错误,提示rgb2gray.m已在matlab路径中存在,直接点更改文件夹即可。
与demo18相比,只是多了一个rgb2Gray的模块,也就是下面这一段代码,在从SDRAM读出来之后,经它处理后再输出hdmi_tx模块。
rgb2gray u_rgb2gray
(
.i_clk(clk_pixel),
.i_rst_n(sys_rst_n),
.i_hs(VGA_HS),
.i_vs(VGA_VS),
.i_de(VGA_DE),
.i_r(VGA_RGB[23:16]),
.i_g(VGA_RGB[15:8]),
.i_b(VGA_RGB[7:0]),
.o_gray_hs(gray_hs),
.o_gray_vs(gray_vs),
.o_gray_de(gray_de),
.o_gray_data(gray_data)
);
跟上一个教程一样,要在不带浮点DSP的FPGA中实现,先将浮点转定点,老办法等式右边先乘256进行四舍五入小数转整数,然后再除256。最终公式如下:
在这个公式中,R,G,B 表示彩色图像的红色、绿色和蓝色通道的像素值,Y 表示生成的灰度图像的像素值。整数权重 77,151,2877,151,28 是原始权重 0.299×256,0.587×256,0.114×2560.299×256,0.587×256,0.114×256 分别放大256倍后取整得到的结果。将结果除以256是因为放大了256倍,相当于整体右移8位,所以需要将结果右移8位。即:
Y = (77 * R + 150 * G + 29 * B)>>8
核心代码就下面两段:
先做各个分量的乘法计算,
r_d0 <= 77 * i_r;
g_d0 <= 150 * i_g;
b_d0 <= 29 * i_b;
然后求和,
gray_d0 <= r_d0 + g_d0 + b_d0;
跟demo19一样,分成两步也是为了时序。同样也需要将行场信号打一拍。
与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。
与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。
跟YCbCr的Y图像有点像,但是看起来对比度要比Y图像质量高一点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。