文章目录
这里是引用
前言
近年来,青岛附近海域的藻华现象越来越严重,针对这一问题,我们暑期实践选择了对藻华图像的处理,利用FPGA识别出图像中的浒苔。
一、软件安装
我们选用的板卡是xilinx中的ZYNQ-z7-20,软件需要使用VIVADO,同时使用vitis HLS将阈值计算部分的C代码转为Verilog代码。VIVADO和HLS的安装步骤网上有很详细的步骤,下面是我安装时参考的博客。
参考博客–最详细的Vivado安装教程
二、算法实现
1.图片数据读入
我们选择将图片数据由Matlab转化为coe文件后导入FPGA的rom中,在后续的数据处理中读取rom中的图片数据。
Matlab将PNG文件转为coe文件代码如下:
%读入的图片是灰度图,如果是RGB格式需要先转换为灰度图。
src = imread('19.png');
[m,n] = size( src );%
N = m*n;
word_len = 8;
data = reshape(src, 1, N);
fid=fopen('19.coe', 'wt');%打开文件
fprintf(fid, 'MEMORY_INITIALIZATION_RADIX=16;\n');
fprintf(fid, 'MEMORY_INITIALIZATION_VECTOR=\n');
for i = 1 : N-1
fprintf(fid, '%x,\n', data(i));%使用%x表示十六进制数
end
fprintf(fid, '%x;\n', data(N));
fclose(fid);
FPGA中ROM的使用可以借助IP核,ROM核的使用教程可以参考以下博客:
片内ROM读写测试实验
FPGA中ROM的使用部分代码如下:
wire [7:0] rom_data;
reg [17:0] rom_addr;
rom_ip rom_ip_inst
(
.clka (pixclk), //inoput clka
.addra (rom_addr), //input [4:0] addra
.douta (rom_data) //output [7:0] douta
);
always@(posedge pixclk)
begin
if((x_cnt >= 740) && (x_cnt < 1240) && (y_cnt >= 164) && (y_cnt < 828 - 164))
rom_addr <= rom_addr +1'b1;
else if(rom_addr == 18'd250000)//图片为500x500格式,若图片尺寸不同,这一行和上一行需要根据图片的尺寸进行修改。
rom_addr <=18'b0;
else
rom_addr <=rom_addr;
end
2.数据处理
根据图片中浒苔的灰度值更高这一特点,我们选择利用阈值算法对导入的数据进行二值化,将图片中的浒苔识别出来。由于某些图片中存在大气干扰、浒苔数量过多、过少等区别,一个固定的阈值并不能满足所有数据的需要,识别效果很差。因此我们在对图像数据进行预处理后,利用OTSU这一阈值算法进行阈值计算。
OTSU部分我们先用Matlab仿真,无误后利用Matlab中的app将Matlab代码转为C代码,之后利用Vitis HLS将C代码转为Verilog代码,封装成一个IP核导入到工程中进行使用。
1.Matlab仿真
Matlab中OTSU的代码如下:
im=imread("19.png");
m=500;n=500;
num=zeros(1,256);
sum=0;
start=1;
End=256;
for i = 1:m
for j = 1:n
k=im(i,j);
k=k+1;
num(k)=num(k)+1;
sum=sum+1;
end
end
p=zeros(1,256);
for i = 1:256
p(i)=num(i)/(m*n);
end
M=zeros(1,256);
pa=zeros(1,256);
pb=zeros(1,256);
ma=zeros(1,256)