通常的在matlab软件里进行图像处理:1.通过现有的函数:rgb2gray
2.通过rgb2gray的计算公式:约为0.299*R+0.587*G+0.114*B
clear;
clc;
pic_rgb1 = imread('1.jpg');
figure; imshow(pic_rgb1);
for i = 1:142
for j = 1:300
pic_gray1(i,j) = uint8(0.299 * pic_rgb1(i,j,1) + 0.587 * pic_rgb1(i,j,2) + 0.114 * pic_rgb1(i,j,3));
end
end
figure('name','formula'); imshow(pic_gray1);
pic_gray2 = rgb2gray(pic_rgb1);
figure('name','rgb2gray'); imshow(pic_gray2);
1.读取图像数据
在matlab中将图像各个像素的RGB数据分别读取出来,存到rgb.data.txt文件。
clear;
clc;
pic_rgb = imread('1.jpg');
fid_wr_txt = fopen('rgb.data.txt','w');
for i = 1:142
for j = 1:300
fprintf(fid_wr_txt,'%x\n',pic_rgb(i,j,1));
fprintf(fid_wr_txt,'%x\n',pic_rgb(i,j,2));
fprintf(fid_wr_txt,'%x\n',pic_rgb(i,j,3));
end
end
fclose(fid_wr_txt);
2.Vivado中编写设计文件
将rgb2gray的计算公式编写进来,但因为FPGA仅支持整数的运算,所以要将0.299*R+0.587*G+0.114*B等的小数,改成定点数,通常乘以2的n次方,这里乘以2的10次方,即1024(也可以乘以其他更大的2的n次方,只是越大,误差会越小,但所用资源也会更多)。再通过移位或者向量组截取,得到原本的灰度值,取高8位。
module Fpgapicture(
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;
assign gray_temp = 306 * rgb_r + 601 * rgb_g + 116 * rgb_b;
assign gray = gray_temp[17:10];
endmodule
3.编写测试文件
使用函数读取在matlab中形成文件中的数据,并写入对应的存储器中,注意存储器的位数和深度(要和文件中的数据大小和数量相等)。将RGB三个分量通过存储器分别写进公式中,进行计算。打开一个新的文件,将计算后的数据一个一个写进去,最后关闭文件。
`timescale 1ns / 1ps
module Fpgapicture_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 [127799:0];
reg [16:0] adder;
integer fid;
Fpgapicture u1(
.rgb_r(rgb_r),
.rgb_g(rgb_g),
.rgb_b(rgb_b),
.gray(gray)
);
initial $readmemh("D:/FPGApicture/rgb.data.txt",rgb_data_mem);
initial fid = $fopen("D:/FPGApicture/gray.data.txt");
initial begin
adder = 0;
repeat (42600) begin
rgb_r = rgb_data_mem[0 + adder];
rgb_g = rgb_data_mem[1 + adder];
rgb_b = rgb_data_mem[2 + adder];
# 20;
$fdisplay(fid,"%d",gray);
adder = adder + 3;
end
$fclose(fid);
end
endmodule
4.回读新文件里的数据,生成图像
在matlab中读取新文件gray.data.txt里的数据,这里的图像是二维的数组,并强制转换成无符号的8位类型,因第i行第j列的数是数据中的第((i-1)*总列数+j )的数,所以要进行转换成二维数组。
clear;
clc;
fid = fopen('gray.data.txt','r');
gray_data = fscanf(fid,'%d');
fclose(fid);
for i = 1:142
for j = 1:300
gray_fpga(i,j) = uint8(gray_data((i-1)*300+j));
end
end
figure('name','fpga');imshow(gray_fpga);
5.图像对比
Figure1:原图
Figure2:rgb2gray函数处理
Figure3:计算公式处理
Figure4:FPGA处理