**
基于fpga的图像处理之图像灰度化处理
**
本文的思路框架:
①本文采用两种算法进行灰度处理,平均法和加权均值法;加权均值法采用了直接公式求解和查找表两种方式验证
②FPGA设计中三个设计技巧,可用于工程项目借鉴,一是宏定义参数化设计;二是generate if参数定义;三是调用xilinx的rom原语实现ROM核,省去ip核的调用
③通过Matlab实现图片转化hex,存储至原始图片txt文档,用于vivado+modelsim的仿真输入
④将原始图片txt文档,导入fpga开发平台,通过灰度处理算法输出,并将输出数据存储至算法处理后的txt文档
⑤通过Matlab将算法灰度化处理后的txt文档,通过代码转化至图片格式,显示处理
一、图像灰度化处理基础知识
1、基本原理
将彩色图像转化为灰度图像的过程称为图像灰度化处理。
2、RGB888
常见的 24 位深度彩色图像RGB888 中的每个像素的颜色由 R、G、B 三个分量决定,并且三个分量各占 1 个字节,每
个分量可以取值 0~255,这样一个像素点可以有 1600 多万(255255255)的颜色的变化范围。
3、YUV和YCbCr
YUV(YCbCr)是欧洲电视系统所采用的一种颜色编码方法。在 YUV 色彩空间中,每一个颜色有一个亮度信号 Y,和两个色度信号 U 和 V。Y表示明亮度(Luminance 或 Luma),也就是灰阶值;
U和V表示色度(Chrominance 或 Chroma),用于描述影像的饱和度和色调。
4、灰度化图像的方法
彩色转灰度比较简单的方法就是直接拿 RGB 中的一个通道来显示灰度图像,这种方法简单且不做任何的处理。
下面介绍几种常用的求取灰度图像的方法:
4.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)
4.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 是根据人的亮度感知系统调节出来的参数,是个广泛
使用的标准化参数。
YCbCr 转换RGB 公式:
Y = 0.2568R + 0.5041G + 0.0979B + 16;
Cb = -0.1482R - 0.2910G + 0.4392B + 128;
Cr = 0.4392R - 0.3678G - 0.0714*B + 128;
二、Matlab实现原始图片转化hex和图像灰度化处理后图片显示
1、原始图片转化hexmatlab源码
此源码为一张图片的显示,生成hex为24bit的RGB888数据。若为多张,可以修改。
clear;clear all;clc;
%获取图像
image_in = imread(‘lena_1280x720.jpg’);
imshow(image_in),title(‘The original image’);
%生成图像txt文件
FileName=[‘image_’,num2str(size(image_in,1)),‘_’,num2str(size(image_in,2)),‘.txt’];
[row,col,n] = size(image_in);
fid = fopen(FileName,‘w’);
for x = 1:row
for y = 1:col
image_R = dec2hex(image_in(x,y,1));
image_G = dec2hex(image_in(x,y,2));
image_B = dec2hex(image_in(x,y,3));
[rm,rn]=size(image_R);
[gm,gn]=size(image_G);
[bm,bn]=size(image_B);
if rn == 1
image_R =[‘0’,image_R];
elseif rn == 0
image_R =‘00’;
end
if gn == 1
image_G =[‘0’,image_G];
elseif gn == 0
image_G =‘00’;
end
if bn == 1
image_B =[‘0’,image_B];
elseif bn == 0
image_B =‘00’;
end
image_hex=[image_R,image_G,image_B];
fprintf(fid,‘%s\n’,image_hex);
end
end
fclose(fid);
2、图像灰度化处理后图片显示hexmatlab源码
clear;clear all;clc;
row = 720;
col = 1280;
n = 3;
image_sim_pass = uint8(zeros(row,col,n));
fid = fopen(‘image_720_1280_gray_out.txt’,‘r’);
for x = 1:row
for y = 1:col
RGB = fscanf(fid,‘%s’,1);
image_sim_pass(x,y,1) = uint8(hex2dec(RGB(1:2)));
image_sim_pass(x,y,2) = uint8(hex2dec(RGB(3:4)));
image_sim_pass(x,y,3) = uint8(hex2dec(RGB(5:6)));
end
end
fclose(fid);
image_sim_pass1 = uint8(zeros(row,col,n));
fid1 = fopen(‘image_720_1280_gray_out1.txt’,‘r’);
for x = 1:row
for y = 1:col
RGB1 = fscanf(fid1,‘%s’,1);
image_sim_pass1(x,y,1) = uint8(hex2dec(RGB1(1:2)));
image_sim_pass1(x,y,2) = uint8(hex2dec(RGB1(3:4)));
image_sim_pass1(x,y,3) = uint8(hex2dec(RGB1(5:6)));
end
end
fclose(fid1);
image_1 = imread(‘lena_1280x720.jpg’);
subplot(3,1,1);
imshow(image_1), title(‘The original image’);
subplot(3,1,2);
imshow(image_sim_pass),title(‘After processing images’);
imwrite(image_sim_pass,‘lena_1280x720_sim_pass.jpg’);
subplot(3,1,3);
imshow(image_sim_pass1),title(‘After processing images1’);
imwrite(image_sim_pass1,‘lena_1280x720_sim_pass1.jpg’);
三、FPGA图像灰度化处理源码
1、灰度化处理算法之平均值法
求平均法GRAY = (R+B+G)/3=((R+B+G)85)>>8 = ((R+B+G)(26+24+2^2+1))>>8
2、灰度化处理算法之加权均值法(直接公式法)
典型灰度转换公式Gray = R0.299+G0.587+B0.114=(R77 + G150 + B29) >>8
3、灰度化处理算法之加权均值法(查找表法)
将RGB888对应的256组数值,预先存放于rom中,采用rom直接查表实现
四、FPGA开发技巧
1、宏定义使用技巧
基于输入数据可能存在RGB565和RGB888两种数据格式,因此采用宏定义方式来兼容不同的接口
采用
`define RG565
定义接口RGB565接口,否则为RGB888数据接口
采用
`ifdef
···
`else
····
`endif
来实现两种不同接口的功能设计
2、generate if参数定义
通过generata if···else if ···endgenerate来实现不同代码的功能实现,参数化定义
三、调用xilinx的rom原语实现ROM核,省去ip核的调用
采用rom原语导入初始化mem文件,可省去来回生成ip的繁琐工作,便于代码移植和开发