Matlab影象處理-亮度(灰度)變換問題
阿新 • • 發佈:2018-12-30
亮度(灰度)變換是一種非常重要的空間域內處理影象的方法,主要介紹幾個亮度變換函式,以及應用。
函式簡介
1.imadjust
該函式用來調整亮度,可以對映加權至更高的或更低輸出值。
imadjust是亮度變換的基本IPT工具,語法為:
g = imadjust(f,[low_ in high_ in],[low_ out, high_out],gamma);
f:輸入影象;
low_in,high_in,low_out,high_out:將low_ in,至high _ in之間的灰度值對映到low _ out,high_ out。low_ in以下的值和high _ in以上的值被剪下掉。空矩陣預設為[0 1];
gamma
注意:
1.除影象f外,imadjust的其他輸入為[0 1],不論影象的類。若f是unit8,則函式將乘以255。
2.若是high_out小於low _out怎會輸出影象反轉。
2.對數和對比度拉伸變換
這兩種變換時進行動態範圍處理的基本工具。
對數變換
- 實現語法:
g = c*log(1+double(f));
該函式的形狀類似於gamma函式,但是gamma曲線形狀可變,log不可變。 - 主要應用:壓縮動態範圍
比如傅立葉頻譜的顯示範圍很大,高值部分佔優,通過log變換可以進行壓縮,便於處理。 - 注意:期望將導致的壓縮至還原為顯示的全範圍,以下方法實現。
gs = im2unit8(mat2gray(g));
mat2gray將值限定在[0,1]範圍內,im2unit8將值限定在[0,255]範圍內。
對比度拉伸變換
- 實現語法:`g = 1./(1 + (m./(double(f)+eps)).^E)
E:控制函式的斜率
m:顯示的閾值,理想條件下及變成閾值函式。 - 主要應用:可以將輸入值低於m的灰度級壓縮為較暗灰度級範圍內,同樣,將高於m的灰度級壓縮為較亮範圍內。
變換影象如圖所示:
例項分析
我們自己寫一個m函式,實現多種亮度(灰度)變換的功能,同時輸入變數可以放寬,通過檢測輸入變數的個數,來設定預設值。
function g = intrans(f,varargin)
%intrans 函式對灰度圖進行變換
% g = intrans(f,'neg')計算輸入影象的負片
%
% g = intrans(f,'log',c,class)計算c*log(1+f)對數拉伸變換
% 後兩個引數省略,c預設為1,class用於確定輸出的型別為‘unit8’和'unit16',
% 如果省略,輸出型別預設和輸入一樣
% g = intrans(f,'ganmma',gam)對影象做伽馬變換,gam為要求的輸入。
%
%
error(nargchk(2, 4, nargin));
%將輸入引數的個數約束在2-4個
classin = class(f);
%儲存輸入的型別,用以後用;
if strcmp(class(f),'double') & max(f(:)) > 1 & strcmp(varargin{1},'log')
f = mat2gray(f);
else %對於f的其他型別轉換成double型別
f = im2double(f);
end
%決定轉換的型別
method = varargin{1};
%varargin是個單元陣列
%進行確定好的轉換
switch method
case 'neg'
g = imcomplement(f);
case 'log'
if length(varargin) == 1
c = 1;
elseif length(varargin) == 2
c = varargin{2};
elseif length(varargin) == 3
c = varargin{2};
classin = varargin{3};
else
error('Incorrect number f input for the log option.')
end
g = c * log(1 + double(f));
case 'gamma'
if length(varargin) < 2
error('Not enough inputs for the gamma option.')
end
gam = varargin{2};
g = imadjust(f,[ ],[ ],gam);
case 'stretch'
if length(varargin) == 1
%使用預設值
m = mean2(f);
E = 4.0;
elseif length(varargin) == 3
m = varargin{2};
E = varargin{3};
else
error('Incorrect number of inputs for the stretch option.')
end
g = 1./(1 + (m./(f + eps)).^E)
otherwise
error('Unknown enhancement method.')
end
%影象格式轉變為輸入影象的型別
g = mat2gray(g);