FPGA简单图像处理
这个小项目读取一张bmp格式的图像文件,做灰度化,二值化或者色彩调整并输出工程为验证性仿真工程,无需上板,含有不可综合代码,也不能上板
首先,需要借助MATLAB将bmp格式图像文件转化为hex格式
复制代码
imdata = imread('kodim23.bmp'); % 24-bit BMP image RGB888
tmp=1:768*512*3;
m = 1;
for i=1:512
for j=1:768
for k = 1:3
tmp(m)=imdata(i,j,k);
m = m+1;
end
end
end
fid = fopen('kodim23.hex', 'wt');
fprintf(fid, '%x\n', tmp);
fclose(fid);
disp('Text file write done');
disp(' ');
复制代码
Verilog代码部分包含一个图像读取模块,该模块有图像处理的部分,和一个图像写模块,还有一个参数文件用于选择对图像进行那种处理
在读模块中,定义一个位宽为8,深度为数据长度的二维数组用于存储图像数据
reg total_memory;
initial begin
$readmemh(INFILE, total_memory, 0, DATA_SIZE-1);
end
然后通过一段不可综合代码将其中的R, G, B数据分开存储
复制代码
always @(start) begin
if(start) begin
for(i=0;i<DATA_SIZE;i=i+1) begin
temp_bmp = total_memory;
end
for(i=0;i<HEIGHT;i=i+1) begin
for(j=0;j<WIDTH;j=j+1) begin
temp_r = temp_bmp[(WIDTH*i+j)*3+0];
temp_g = temp_bmp[(WIDTH*i+j)*3+1];
temp_b = temp_bmp[(WIDTH*i+j)*3+2];
end
end
end
end
复制代码
参照视频数据流帧格式,输出行场同步信号,通过一个状态机做流程控制,在数据处理时,对图像进行如下处理
复制代码
always @* begin
if(state_c == S_DATA) begin
`ifdef BRIGHTNESS_OPERATION
if(SIGN == 1) begin
DATA_R0 = (temp_r+VALUE>255) ? 255 : temp_r+VALUE;
DATA_R1 = (temp_r+VALUE>255) ? 255 : temp_r+VALUE;
DATA_G0 = (temp_g+VALUE>255) ? 255 : temp_g+VALUE;
DATA_G1 = (temp_g+VALUE>255) ? 255 : temp_g+VALUE;
DATA_B0 = (temp_b+VALUE>255) ? 255 : temp_b+VALUE;
DATA_B1 = (temp_b+VALUE>255) ? 255 : temp_b+VALUE;
end
else begin
DATA_R0 = (temp_r-VALUE<0) ? 0 : temp_r-VALUE;
DATA_R1 = (temp_r-VALUE<0) ? 0 : temp_r-VALUE;
DATA_G0 = (temp_g-VALUE<0) ? 0 : temp_g-VALUE;
DATA_G1 = (temp_g-VALUE<0) ? 0 : temp_g-VALUE;
DATA_B0 = (temp_b-VALUE<0) ? 0 : temp_b-VALUE;
DATA_B1 = (temp_b-VALUE<0) ? 0 : temp_b-VALUE;
end
`else
`ifdef INVERT_OPERATION
DATA_R0 = 255-((temp_r+temp_g+temp_b)/3);
DATA_G0 = 255-((temp_r+temp_g+temp_b)/3);
DATA_B0 = 255-((temp_r+temp_g+temp_b)/3);
DATA_R1 = 255-((temp_r+temp_g+temp_b+1)/3);
DATA_G1 = 255-((temp_r+temp_g+temp_b+1)/3);
DATA_B1 = 255-((temp_r+temp_g+temp_b+1)/3);
`else
`ifdef THRESHOLD_OPERATION
DATA_R0 = ((temp_r+temp_g+temp_b)/3>THRESHOLD) ? 255 : 0;
DATA_G0 = ((temp_r+temp_g+temp_b)/3>THRESHOLD) ? 255 : 0;
DATA_B0 = ((temp_r+temp_g+temp_b)/3>THRESHOLD) ? 255 : 0;
DATA_R1 = ((temp_r+temp_g+temp_b)/3>THRESHOLD) ? 255 : 0;
DATA_G1 = ((temp_r+temp_g+temp_b)/3>THRESHOLD) ? 255 : 0;
DATA_B1 = ((temp_r+temp_g+temp_b)/3>THRESHOLD) ? 255 : 0;
`else
DATA_R0 = temp_r;
DATA_R1 = temp_r;
DATA_G0 = temp_g;
DATA_G1 = temp_g;
DATA_B0 = temp_b;
DATA_B1 = temp_b;
`endif
`endif
`endif
end
else begin
DATA_R0 = 0;
DATA_R1 = 0;
DATA_G0 = 0;
DATA_G1 = 0;
DATA_B0 = 0;
DATA_B1 = 0;
end
end
复制代码
写模块将读模块输出的数据写入到bmp格式文件中,重点需要注意的是
!!!bmp存储数据是从最后一行开时,依次往上,即以一个数据是图像左下的的像素的数据,且每个像素的数据是以B, G, R的顺序依次存储
FPGA简单图像处理 FPGA简单图像处理
页:
[1]