对数变换(包括用mif文件生成rom ip核设置)

1、简介

图像增强常用的三类基本函数变换:

一、线性函数(反转和恒等变换)

二、对数函数(对数和反对数变换)

三、幂律函数(n次幂和n次根变换),又叫伽马变换。

bedb39f590574831af957d48842f9fc9.png

其中第一种属于线性变换;第二、三种属于非线性变换。 接下来讲的对数变换

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

833b714a63c74064a52ba290844b1a39.png

3、用mif生成rom ip核设置

6c5a05101a924560981f0860a2959c64.png

 31746b3ad4f34167a08c3206220408a3.png

84d8645d1b5f4982b3238d53b1d10fd2.png

如果不勾选‘q’ output port,输出的q 本身就会延迟一拍。如果勾选‘q’ output port,输出的q 就会相对于本身输出再多延迟一拍,即总共延迟两拍。此处我不勾选,则只延迟一拍,后面则需要做一拍的使能和行场同步就行了。

4197e88476e34773ab523c6c383dc453.png

如果这样使用相对路径,则会导致rom读出的q一直为0。所以下面我们将相对路径改成绝对路径,才能得到查表q的值。

45a4b2e6bde24c7a852b377caef5a74e.png

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

以下是仿真结果分析: 

03cefe0f01714736944b15b4ded12368.png

036da61c0f79440e8bf756cebebd8174.png

 通过传进去的图像数据给address,进行查表得到q值,进而输出新的对数变换后的图像数据。比如:传进来的图像第一个像素值为9,则通过查表得到对应的对数变换的像素值为104,并输出。

以下是得到的图片结果 :

原始图(1.bmp)

5ad90ac0253e40198d507efba6049838.bmp

FPGA对数变换图(2.bmp) 

a3ab7a6b5e2c445fb31551a20778b309.bmp  

 MATLAB对数变换图

13d335762ea34a0a8b315e9a3698c4dd.bmp

整体效果变亮啦,并且与MATLAB效果一致,FPGA的对数变换实验成功。 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值