[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-4FPGA 实现彩色图像转灰度图像

文档创建者:FPGA课程
浏览次数:80
最后更新:2024-10-16
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 8-FPGA图像入门
本帖最后由 FPGA课程 于 2024-10-16 18:55 编辑

​ 软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1 彩色图像转灰度算法简介
日常生活中遇到的图像基本都是彩色图像,在工业应用领域常常需要将彩色图像转换成灰度图像。彩色图像是 三个通道 RGB,灰度图像只有一个通道。
彩色转灰度比较简单的方法就是直接拿 RGB 中的一个通道来显示灰度图像,这种方法简单且不做任何的处理。 下面介绍几种常用的求取灰度图像的方法:
1 、 平均法
I(x,y)表示灰度图像,取彩色图像 RGB 三个通道每个值的 1/3 相加,公式如下:
I(x,y) = 1/3 * I_R(x,y) +1/3 * I_G(x,y)+ 1/3 * I_B(x,y)
2 、 加权均值法
I(x,y)表示灰度图像,取彩色图像 RGB 三个通道每个值乘相应的权值后相加,公式如下:
I(x,y) = 0.299 * I_R(x,y) +0.587 * I_G(x,y)+ 0.114 * I_B(x,y)
这是最流行的方法。几个加权系数 0.299,0.587,0.114  是根据人的亮度感知系统调节出来的参数,是个广泛 使用的标准化参数。
3 、 最大最小平均法
I(x,y)表示灰度图像,取彩色图像 RGB 三个通道中最大和最小值的 1/2 相加,公式如下:
I(x,y) = 1/2 * max(I_R(x,y), I_G(x,y), I_B(x,y))+ 1/2 * min(I_R(x,y), I_G(x,y), I_B(x,y))
4 、 二值图像
除了灰度图,还有一种图像叫二值图,也就是灰度只有 0 和 255,这才是真正的黑白图像,因为 0 代表黑 色,255 代表白色。我们设定一个阈值 T,当某像素点的灰度值大于 T 时,设定该像素点的值为 255 ,当小于 T 时,设定为 0。
5 、 反转图像
反转图像公式:I(x,y) = 255- I_Gray(x,y)。反转图像特别适用于增强暗色图像中的白色或灰色细节。
本实验我们将会用到第二种甲权平均法来对彩色图像惊醒处理。在硬件算法中分为浮点运算和定点运算而在实 际应用中我们是要避免浮点运算,尽量用整数运算。对于第二个运算方法中,一般会放大 1000 倍,然后再缩小 1000 倍,此时因为是整数除法因此需要再加上常数来不足误差。

2 框图原理图
1a97e948e430490faa88db9bc2bdd784.jpg

3 关键代码设计分析
3.1Matlab代码分析
源代码如下:

  1. %      0.299 * R + 0.587 * G + 0.114 * B %
  2. image_in = imread('lena_1280x720.jpg');

  3. image_in_r = image_in(:,:,1);  image_in_g = image_in(:,:,2); image_in_b = image_in(:,:,3);
  4. gray1 =    0.299 * image_in_r + 0.587 * image_in_g + 0.114 * image_in_b;
  5. gray2 = rgb2gray(image_in);

  6. figure
  7. subplot(221);
  8. imshow(image_in); subplot(222);
  9. imshow(gray1);
  10. subplot(223);
  11. imshow(image_in); subplot(224);
  12. imshow(gray2);
复制代码

3.2Verilog代码分析
  1. //按照 1 节中的公式中进行公式变换:
  2. // gray1 =    0.299 * image_in_r + 0.587 * image_in_g + 0.114 * image_in_b; //先乘以256 然后右移 8 位。
  3. // gray1 =    256*(0.299 * image_in_r + 0.587 * image_in_g + 0.114 * image_in_b)>>8; //最终结果如下:
  4. // gray1 =    (77 * image_in_r + 150 * image_in_g + 29 * image_in_b)>>8; //我们将乘法运算单独在一个时钟周期中完成,代码如下:
  5. always@(posedge i_clk ornegedge i_rst_n) begin
  6. if(!i_rst_n) begin
  7. r_d0 <= 16'd0;  g_d0 <= 16'd0; b_d0 <= 16'd0;
  8. end    else    begin
  9. r_d0 <= 77    * i_r;  g_d0 <= 150 * i_g;  b_d0 <= 29    * i_b;
  10. end end
  11. //完成乘法后进行加减法运算:
  12. always@(posedge i_clk ornegedge i_rst_n) begin
  13. if(!i_rst_n) begin
  14. gray_d0 <= 16'd0; end
  15. else    begin
  16. gray_d0 <= r_d0 + g_d0 + b_d0; end
  17. end
  18. //最后进行信号的同步:
  19. always@(posedge i_clk ) begin
  20. hsyn <= {hsyn[0],i_hsyn};
  21. vsyn <= {vsyn[0],i_vsyn};
  22. de <= {de[0],i_de};
  23. end

  24. assign o_gray_hsyn = hsyn[1];
  25. assign o_gray_vsyn = vsyn[1];
  26. assign o_gray_data = {gray_d0[15:8],gray_d0[15:8],gray_d0[15:8]};
  27. assign o_gray_de   = de[1];
复制代码


4 工程结构分析
d3cf547f682043cf84c3668b850b3dd9.jpg
5 仿真及结果
5.1Matlab实验结果

27426c4f779743249f13b21bb392fcb3.jpg

5.2Modelsim实验结果

473cbe3a51d3482a862a7989d2cac607.jpg

6 搭建 Vitis-sdk 工程
创建 soc_base  sdk  platform  和 APP  工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。
6.1 创建 SDKPlatform工程
6242be3844124f8a9b22afeca80b7f0b.jpg
6.2SDKAPP工程

6d166f0ac2e948ecb29fd0027bb37d5c.jpg
计数器从 1 到 1280 再发送完 de 拉低。

7 硬件连接
78981259feee4a47b0d88d33e203cf13.jpg
8 上板实验结果
实验结果如图所示:
71be1b7e18df405eaa74cc7da13ebd53.jpg


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则