基於FPGA的灰度圖像處理之對數變換
1 背景知識
對數變化的通用公式:s = clog(1+r)--------------------------------------------------------------(1)
其中c是一個常數,r爲灰度級。
圖1中對數曲線的形狀表明,該變換將輸入中範圍較窄的低灰度值映射爲輸出中較寬範圍的灰度值,相反地,對高的輸入灰度值也是如此。我們使用這種類型的變換來擴展圖像中的暗像素的值,同時壓縮更高灰度級的值。反對數變換的作用與此相反。
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
結果:
部分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設置:
實驗結果:
結果分析:
由圖3可知,灰度值整體被拉大。由圖4和圖5觀察可得圖中白色區域明顯增多,某些白色線條被拉長。符合log變換將輸入中範圍較窄的低灰度值映射爲輸出中較寬範圍的灰度值,相反地,對高的輸入灰度值也是如此。實驗成功。我們猜想正常的灰度圖像會被整體變亮,有興趣的同學可以去實驗。
由此我們可以得出對數變化的實際應用。比如夜間拍照圖像過暗,我們可以採用對數變換;如果圖像過度曝光也就是偏亮,我們可以採用反對數變換。
歡迎關注微信公衆號:FPGA開源工作室
獲取更多學習資料。