PotatoPie 4.0 实验教程(20) —— FPGA实现摄像头图像转灰度图像(RGB2Gray)

PotatoPie 4.0开发板教程目录(2024/04/15)

什么是灰度图?

灰度图是一种只包含灰度信息(亮度信息)而不包含彩色信息的图像。在灰度图中,每个像素的亮度值表示图像中对应位置的亮度级别,通常用 0 到 255 之间的整数值表示,0 表示黑色,255 表示白色,中间的值表示不同程度的灰度。

灰度图是由彩色图像经过灰度化处理得到的,灰度化处理是将彩色图像的 RGB(红绿蓝)三个通道的颜色值转换为单一的灰度值的过程。常见的灰度化方法包括将 RGB 三个通道的像素值按照一定的权重进行加权平均,或者采用其他算法,如最大值法、最小值法等。

灰度图常用于图像处理、计算机视觉、模式识别等领域。与彩色图像相比,灰度图具有更低的存储空间和处理复杂度,因此在一些应用中更加高效。例如,人脸识别、图像检索、医学图像分析等领域常常使用灰度图来简化图像处理过程。

为什么要使用灰度图?

使用灰度图有几个重要的原因:

  1. 简化处理:灰度图仅包含亮度信息,相比彩色图像,其数据量更小,处理起来更加简单和高效。这使得在一些应用中,如图像处理、模式识别、计算机视觉等,可以节省计算资源和时间。

  2. 降低复杂性:灰度图消除了彩色信息,使图像更加简洁,更容易理解和分析。在一些应用中,如医学图像分析、地质图像分析等领域,灰度图可以使得图像的特征更加明显,更容易被专业人员识别和分析。

  3. 增强对比度:在某些情况下,灰度图比彩色图更容易展示图像的细节和结构,因为彩色信息可能会分散注意力,而灰度图则能够集中观察者的注意力于图像的亮度变化和纹理细节上。

  4. 适应特定应用:有些应用只需要图像中的亮度信息而不需要彩色信息,例如,自动识别、人脸识别、目标检测等应用可以在灰度图上更有效地进行,因为亮度信息往往是决定图像中对象特征的关键因素。

  5. 减少数据存储和传输开销:由于灰度图的数据量比彩色图小很多,因此在存储和传输方面具有更高的效率,尤其是在需要大量图像数据的场景中,如视频流传输、图像数据存档等。

灰度图公式

灰度图像的生成通常通过将彩色图像的 RGB(红绿蓝)三个通道的像素值转换为单一的灰度值。有几种常用的灰度化方法,其中最常见的一种是将 RGB 三个通道的像素值按照一定的权重进行加权平均。一个常用的灰度化公式是加权平均法:

其中,R,G,B 分别表示彩色图像的红色、绿色和蓝色通道的像素值,表示生成的灰度图像的像素值。

在这个公式中,红色通道的权重是 0.299,绿色通道的权重是 0.587,蓝色通道的权重是 0.114。这些权重是根据人眼对不同颜色的敏感度而选择的,它们使得生成的灰度图像更加符合人眼的感知。

 用python实现RGB转Gray灰度算法

 

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的绝对路径。

 用Matlab实现RGB转Gray灰度算法

[登录可见]隐藏内容 - 作者可见

 

% 图片文件路径

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路径中存在,直接点更改文件夹即可。

FPGA工程解析

工程数据流图

代码解析

与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 表示彩色图像的红色、绿色和蓝色通道的像素值,表示生成的灰度图像的像素值。整数权重 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图像质量高一点。

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值