基於FPGA的灰度圖像處理之冪律(伽馬)變化
1 背景知識
冪律變換的基本形式爲:
(1)
其中c和爲正常數。有時考慮到偏移量 可將式(1)寫爲。偏移量一般是顯示標定問題,作爲一個結果,通常在式(1)中忽略不計。對於不同的值,s與r的關係如圖1所示。
與對數變換的情況類似,部分值的冪律曲線將較窄範圍的暗色輸入值映射爲較寬範圍的輸出值,相反的,對於輸入高灰度級值時也成立。然而與對數函數不同的是,隨着值的變化,將簡單地得到一簇可能的變化曲線。如圖1所示,>1的值所生成的曲線和<1的值所生成的曲線的效果完全相反。當c==1時簡化成了恆等變換。
用於圖像獲取,打印和顯示的各種設備根據冪律來產生響應。習慣上,冪律方程中的指數稱爲伽馬。用於校正這些冪律響應現象的處理稱爲伽馬校正。
如圖2所示,a航拍原圖b~d令c=1且分別等於3.0,4.0和5.0時應用式(1)給出的變換的結果(此例的原圖像由NASA提供)。
2 FPGA實現
圖3 FPGA實現冪律變換框架圖
由圖2可知對於灰度圖像直接經過冪律變換就可以得到冪律變換圖像,但是對於FPGA直接實現對數公式顯然難度很大。在FPGA中我們採用基於查找表的方式進行冪律變換。
ROM表的製作:
Matlab源碼:
clear all
close all
clc
depth = 256;
width =8;
r = [0:1:255];
x = r; %恆等變換
y =16*sqrt(r);%開根
%z = round(y);
m = (1/256)*r.^2; %r平方
z = round(m);
fid = fopen('E:\matlab_project\log\square.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);
plot(m);
hold off
FPGA源碼:
//------------------------------------------
// power law
//------------------------------------------
wire [7:0] sqrt_data; //root
wire [7:0] square_data;//square
rom_sqrt rom_sqrt_inst(
.address(o_y_8b),
.clken(TFT_de),
.clock(TFT_clk),
.q(sqrt_data)
);
rom_square rom_square_inst(
.address(o_y_8b),
.clken(TFT_de),
.clock(TFT_clk),
.q(square_data)
);
//assign TFT_rgb = {sqrt_data[7:3],sqrt_data[7:2],sqrt_data[7:3]}; //Y
assign TFT_rgb = {square_data[7:3],square_data[7:2],square_data[7:3]}; //Y
//assign TFT_rgb = {o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]}; //Y
IP設置:
實驗結果:
結果分析:
圖9、圖10和圖8相比,圖9明顯變暗,圖10明顯變亮。此技術可以應用在圖像採集系統上。當拍攝的光線較暗時,我們可以採取亮變換;當光線過強時,我們可以採取暗變化。從而達到人眼更適合的效果。
歡迎關注微信公衆號:FPGA開源工作室
獲取更多學習資料。