基於FPGA圖像處理之對數變換(log)

基於FPGA的灰度圖像處理之對數變換

1 背景知識

對數變化的通用公式:s = clog(1+r)--------------------------------------------------------------(1)

其中c是一個常數,r爲灰度級。
在這裏插入圖片描述

圖1 一些基本的灰度變換函數

圖1中對數曲線的形狀表明,該變換將輸入中範圍較窄的低灰度值映射爲輸出中較寬範圍的灰度值,相反地,對高的輸入灰度值也是如此。我們使用這種類型的變換來擴展圖像中的暗像素的值,同時壓縮更高灰度級的值。反對數變換的作用與此相反。

2 FPGA實現

在這裏插入圖片描述

圖2 FPGA實現對數變換框架圖

由圖2可知對於灰度圖像直接經過對數變換就可以得到對數變換圖像,但是對於FPGA直接實現對數公式顯然難度很大。在FPGA中我們採用基於查找表的方式進行對數變換。

ROM表的製作:

Matlab源碼:

clear all
close all
clc
depth = 256;
width =8;
r = [0:1:255];
y = 45*log(1+r);
x = r;
z = round(y);
fid = fopen('E:\matlab_project\log\log2.mif','w');%路徑 
fprintf(fid,'depth= %d; \n',depth); 
fprintf(fid,'width= %d; \n',width); 
fprintf(fid,'address_radix=uns;\n'); 
fprintf(fid,'data_radix = uns;\n'); 
fprintf(fid,'Content Begin \n'); 
for(k=1:depth)  
  fprintf(fid,'%d: %d; \n',k-1,z(k)); 
end
fprintf(fid,'end;');
hold on
plot(x);
plot(y);
hold off

結果:
在這裏插入圖片描述

圖3 log函數圖

部分Rom表:

depth= 256;     %數據深度
width= 8;       %數據位寬
address_radix=uns;
data_radix = uns;
Content Begin 
0: 0; 
1: 31; 
2: 49; 
3: 62; 
4: 72; 
5: 81; 
6: 88; 
7: 94; 
8: 99; 
9: 104; 
10: 108; 
...
...
...
250: 249; 
251: 249; 
252: 249; 
253: 249; 
254: 249; 
255: 250; 
end;

FPGA源碼:

//------------------------------------------
// log
//------------------------------------------	
wire [7:0]	 log_data;				
rom_log rom_log_inst(
	     .address(o_y_8b),
	     .clock(TFT_clk),
	     .q(log_data)
		  );

assign TFT_rgb = {log_data[7:3],log_data[7:2],log_data[7:3]};     //Y

IP設置:

在這裏插入圖片描述

圖4 ROM IP設置1

在這裏插入圖片描述

圖5 ROM IP 設置2

在這裏插入圖片描述

圖6 ROM IP設置3

實驗結果:

在這裏插入圖片描述

圖7 實驗原圖

在這裏插入圖片描述

圖8 實驗結果

結果分析:

由圖3可知,灰度值整體被拉大。由圖4和圖5觀察可得圖中白色區域明顯增多,某些白色線條被拉長。符合log變換將輸入中範圍較窄的低灰度值映射爲輸出中較寬範圍的灰度值,相反地,對高的輸入灰度值也是如此。實驗成功。我們猜想正常的灰度圖像會被整體變亮,有興趣的同學可以去實驗。
由此我們可以得出對數變化的實際應用。比如夜間拍照圖像過暗,我們可以採用對數變換;如果圖像過度曝光也就是偏亮,我們可以採用反對數變換。
歡迎關注微信公衆號:FPGA開源工作室
獲取更多學習資料。
FPGA開源工作室

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章