1、简介
图像增强常用的三类基本函数变换:
一、线性函数(反转和恒等变换)
二、对数函数(对数和反对数变换)
三、幂律函数(n次幂和n次根变换),又叫伽马变换。
其中第一种属于线性变换;第二、三种属于非线性变换。 接下来讲的对数变换
2、mif文件生成
利用matlab来生成mif文件。
%--------------------------------------------------------------------------
%-- 生成log变换所需的rom mif文件
%--------------------------------------------------------------------------
clear all
close all
clc
depth = 256;
width = 8;
r = [0:1:255];
s = 45*log(1+r);%对数变换公式:s=c*log(1+r)
fid = fopen('log.mif','w');%路径
fprintf(fid,'depth= %d; \n',depth);%位宽
fprintf(fid,'width= %d; \n',width);%深度(即数据量)
fprintf(fid,'address_radix=uns;\n');%地址格式(unsigned)
fprintf(fid,'data_radix = uns;\n');%数据格式(unsigned)
fprintf(fid,'Content Begin \n');%开始
z = round(s);
for(k=1:depth)
fprintf(fid,'%d: %d; \n',k-1,z(k));
end
fprintf(fid,'end;');
%--------------------------------------------------------------------------
%-- 曲线展示
%--------------------------------------------------------------------------
hold on
plot(r);
plot(s);
legend('原曲线','log变换');
hold off
3、用mif生成rom ip核设置
如果不勾选‘q’ output port,输出的q 本身就会延迟一拍。如果勾选‘q’ output port,输出的q 就会相对于本身输出再多延迟一拍,即总共延迟两拍。此处我不勾选,则只延迟一拍,后面则需要做一拍的使能和行场同步就行了。
如果这样使用相对路径,则会导致rom读出的q一直为0。所以下面我们将相对路径改成绝对路径,才能得到查表q的值。
4、通过modelsim读写bmp图片得到对数变换后的图片
以下是rtl代码:
module log
//========================< 端口 >==========================================
(
input wire clk , //时钟
input wire rst_n , //复位
//input ---------------------------------------------
input wire Y_hsync , //Y行同步
input wire Y_vsync , //Y场同步
input wire [7:0] Y_data , //Y数据
input wire Y_de , //Y数据使能
//output --------------------------------------------
output wire log_hsync , //log行同步
output wire log_vsync , //log场同步
output wire [7:0] log_data , //log数据
output wire log_de //log数据使能
);
reg Y_de_r ;
reg Y_hsync_r;
reg Y_vsync_r;
//==========================================================================
//== log变换
//==========================================================================
rom_log rom_log_inst
(
.address (Y_data ), //x轴数据
.clock (clk ),
.q (log_data ) //根据写进去的x轴数据得到y轴的数据
);
//==========================================================================
//== 信号同步,rom给地址到出数据会延迟1clk
//==========================================================================
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
Y_de_r <= 1'b0;
Y_hsync_r <= 1'b0;
Y_vsync_r <= 1'b0;
end
else begin
Y_de_r <= Y_de;
Y_hsync_r <= Y_hsync;
Y_vsync_r <= Y_vsync;
end
end
assign log_de = Y_de_r;
assign log_hsync = Y_hsync_r;
assign log_vsync = Y_vsync_r;
endmodule
以下是仿真结果分析:
通过传进去的图像数据给address,进行查表得到q值,进而输出新的对数变换后的图像数据。比如:传进来的图像第一个像素值为9,则通过查表得到对应的对数变换的像素值为104,并输出。
以下是得到的图片结果 :
原始图(1.bmp)
FPGA对数变换图(2.bmp)
MATLAB对数变换图
整体效果变亮啦,并且与MATLAB效果一致,FPGA的对数变换实验成功。