FPGA数字图像处理 灰度变换 Vivado传送图片数据 verilog

通常的在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处理

FPGA数字图像处理 灰度变换 Vivado传送图片数据 verilog_第1张图片

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