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