软件版本:VIVADO2018.3
操作系统:WIN10 64bit
硬件平台:ZYNQ7020
1 概述
本工程以3*3领域范围为例,构建矩阵为3*3的图像处理算子,对分辨率为500*500的图像进行中值滤波(分辨率设置采用参数化设置,可根据需要任意修改)。
工程包含matlab代码、FPGA实现代码以及仿真文件。
关于中值滤波算法的介绍网上有很多,这里就不介绍了,不了解的可以自己百度。这里主要介绍图像处理算子的实现。
2 图像处理算子
因为数字图像数据是逐行逐列、逐个像素读取,要读出一个3×3区域内的数据,需要借助缓存来实现。可以利用两级FIFO流水线结构,存储当前读取像素位置前两行的数据,如下图所示。
此时,在读取像素的同时可以按照坐标关系,从FIFO中读出3×3区域内的其他所有像素值。需要注意的是,这里采用了边界用相邻的像素点填充的方法,这种方法所读取到的区域是以当前读取像素为中心的矩阵。
图像处理算子仿真波形
将得到的3x3矩阵中的每行分别排序,求出最大值、最小值和中值,再将每一行的最大值、每一行的最小值、每一行的中值分别排序;最后将最大值的最小值、最小值的最大值、中值的中值进行排序,得到的中值即为3x3矩阵窗口的中值。程序整体结构如下图:
-
3 matlab仿真
%% 此代码实现将jpg图像转换成灰度图,写入到txt文件,目的以供应modelsim仿真使用
clc;
clear all;
close all;
%% 读取待写入图像
pic_data = imread('G:\mid_filter_prj\matlab\lenna.jpg');
pic_data_noise = imnoise(pic_data,'salt & pepper',0.05); %椒盐密度0.05
gdata=rgb2gray(pic_data_noise)
[ROW COL] = size(gdata);
% 对原图进行处理,将处理完的图像数据写入read.txt文件
fid = fopen('G:\mid_filter_prj\matlab\read.txt','w+');
for i = 1: ROW
for j = 1:COL
fprintf(fid,'%01x\n',gdata(i,j));
end
end
fclose(fid);
Median_Img = medfilt2(gdata);
%读取FPGA仿真数据
medfilt_v_load = load('G:\mid_filter_prj\matlab\image_out.txt');
medfilt_v = reshape(medfilt_v_load, COL, ROW);
medfilt_v = uint8(medfilt_v');
figure(1);
imshow(medfilt_v);
title('FPGA中值滤波.jpg');
%--------------------------------------------------------------------------
% Show Image
%--------------------------------------------------------------------------
figure(2);
subplot(2,2,1); imshow(pic_data); title('原图');
subplot(2,2,2); imshow(gdata); title('椒盐噪声');
subplot(2,2,3); imshow(medfilt_v); title('FPGA中值滤波');
subplot(2,2,4); imshow(Median_Img); title('matlab中值滤波');