本帖最后由 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 框图原理图
3 关键代码设计分析3.1Matlab代码分析 源代码如下:
- % 0.299 * R + 0.587 * G + 0.114 * B %
- image_in = imread('lena_1280x720.jpg');
- image_in_r = image_in(:,:,1); image_in_g = image_in(:,:,2); image_in_b = image_in(:,:,3);
- gray1 = 0.299 * image_in_r + 0.587 * image_in_g + 0.114 * image_in_b;
- gray2 = rgb2gray(image_in);
- figure
- subplot(221);
- imshow(image_in); subplot(222);
- imshow(gray1);
- subplot(223);
- imshow(image_in); subplot(224);
- imshow(gray2);
复制代码
3.2Verilog代码分析 - //按照 1 节中的公式中进行公式变换:
- // gray1 = 0.299 * image_in_r + 0.587 * image_in_g + 0.114 * image_in_b; //先乘以256 然后右移 8 位。
- // gray1 = 256*(0.299 * image_in_r + 0.587 * image_in_g + 0.114 * image_in_b)>>8; //最终结果如下:
- // gray1 = (77 * image_in_r + 150 * image_in_g + 29 * image_in_b)>>8; //我们将乘法运算单独在一个时钟周期中完成,代码如下:
- always@(posedge i_clk ornegedge i_rst_n) begin
- if(!i_rst_n) begin
- r_d0 <= 16'd0; g_d0 <= 16'd0; b_d0 <= 16'd0;
- end else begin
- r_d0 <= 77 * i_r; g_d0 <= 150 * i_g; b_d0 <= 29 * i_b;
- end end
- //完成乘法后进行加减法运算:
- always@(posedge i_clk ornegedge i_rst_n) begin
- if(!i_rst_n) begin
- gray_d0 <= 16'd0; end
- else begin
- gray_d0 <= r_d0 + g_d0 + b_d0; end
- end
- //最后进行信号的同步:
- always@(posedge i_clk ) begin
- hsyn <= {hsyn[0],i_hsyn};
- vsyn <= {vsyn[0],i_vsyn};
- de <= {de[0],i_de};
- end
- assign o_gray_hsyn = hsyn[1];
- assign o_gray_vsyn = vsyn[1];
- assign o_gray_data = {gray_d0[15:8],gray_d0[15:8],gray_d0[15:8]};
- assign o_gray_de = de[1];
复制代码
4 工程结构分析
5 仿真及结果5.1Matlab实验结果
5.2Modelsim实验结果
6 搭建 Vitis-sdk 工程
创建 soc_base sdk platform 和 APP 工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。 6.1 创建 SDKPlatform工程
6.2SDKAPP工程
计数器从 1 到 1280 再发送完 de 拉低。
7 硬件连接
8 上板实验结果
实验结果如图所示:
|