Matlab+FPGA进行灰度图像处理

Matlab+FPGA进行灰度图像处理

*MATLAB主要用于思路验证,转到FPGA的话需要对底层函数逻辑清楚才行,python也能进行matlab在这里做的所有操作,有兴趣可以深入。

1.matlab读取图片显示:

pic_rgb = imread('1.jpg'); %477x692x3
figure; imshow(pic_rgb);

//调用函数灰度显示
pic_gray = rgb2gray(pic_rgb);%477x692
figure; imshow(pic_gray);

2.matlab灰度反显

pic_reverse_gray = pic_gray;  %确定图片大小

for i = 1:477
	for j = 1:692
		pic_reverse_gray(i,j) =uint8(255-pic_gray(i,j));
	end
end
figure; imshow(pic_reverse_gray);

3.matlab二值化,将灰度进行黑白划分

pic_2 = pic_gray;  %确定图片大小

for i = 1:477
	for j = 1:692
			if (pic_gray(i,j)>140)    %140为分界线,可自由设置
				pic_2(i,j) = uint8(255);
			else
				pic_2(i,j) = uint8(0);
			end
	end
end
figure; imshow(pic_2 );

思路:用matlab将图片写成TXT发送给FPGA进行处理,然后将FPGA处理完的数据返回给matlab进行显示查看是否正确。

  1. matlab把图片转到txt格式,文件名:rgb_data.txt
clear;
clc;
pic_rgb =imread('1.jpg')

pic_txt = fopen('rgb_data.txt','w');

for i = 1:477
	for j = 1:692
		fprintf(pic_txt,'%x \n', pic_rgb (i,j,1));
		fprintf(pic_txt,'%x \n', pic_rgb (i,j,2));
		fprintf(pic_txt,'%x \n', pic_rgb (i,j,3));
	end
end

fclose(pic_txt);
  1. FPGA进行读取txt并进行处理数据,注意小数的变化,并进行仿真处理输出txt格式
module pic_deal(
input	  wire [7:0] rgb_r,
input		wire [7:0] rgb_g,
input		wire [7:0] rgb_b,

output	wire [7:0] gray

);
wire [17:0] gray_temp;
//gray = 0.299*R+0.587*G+0.114*B,扩大1024倍,而后截取整数位
assign gray_temp= 306*rgb_r+601*rgb_g+117*rgb_b;
assign gray     = gray_temp[17:10];
/*考虑四舍五入的话就执行下列方式
assign gray     = (gray_temp[9]==1)?(gray_temp[17:10]+1):gray_temp[17:10];
*/
endmodule
`timescale 1ns/1ps
module rgb_data_tb();
	reg  [7:0] rgb_r;
	reg  [7:0] rgb_g;
	reg  [7:0] rgb_b;
	wire [7:0] gray;

	reg [7:0] rgb_data_mem[990251 : 0];//有多少个数值就改成多少位宽
	reg [19:0] addr;
	integer     fid;
pic_deal rgb2gray_inst(
	.rgb_r(rgb_r),
	.rgb_g(rgb_g),
	.rgb_b(rgb_b),
	.gray (gray)
);
//读取txt的文件内容并存放到寄存器,txt文件在Vivado中要放到xsim文件中,才可以调用
initial $readmemh("rgb_data.txt",rgb_data_mem);
//保存处理的文件
initial fid =$fopen("gray_data.txt");

initial begin
	addr = 0;
	repeat(477*692)begin
		rgb_r = rgb_data_mem[0+addr];
		rgb_g = rgb_data_mem[1+addr];
		rgb_b = rgb_data_mem[2+addr];
		#20;
		$fdisplay(fid,"%d",gray);
		addr = addr +3;
		$fclose(fid);
	end
end
endmodule

Matlab+FPGA进行灰度图像处理_第1张图片

注意,在Vivado中生成txt文件的时候,仿真时间的设置对应了数据能否全部记录到生成的文件中,所以需要根据自己的图片大小设置时间长度!具体的方式就是先仿真一次看地址到达最后一个数据值时的时间是多少,再把这个时间改到下面的仿真时间里就好了。结束过后,要刷新一次存放生成文件的文件夹,txt文件才会刷新。

  1. matlab读取txt文件
fid = fopen('gray_data.txt','r');
gray_data = fscanf(fid,'%d');%1维数据,需要转换为二维,转换的方式需要思考一下
	end
fclose(fid);

for i = 1:477
	for j = 1:692
		pic_gray_my(i,j) = uint8(gray_data((i-1)*692+j));%一定要转化格式为无符号8位
end

figure('name','pic_gray_my');
imshow(pic_gray_my);

你可能感兴趣的:(matlab,fpga开发,图像处理)