1. 程式人生 > >Matlab影象處理-亮度(灰度)變換問題

Matlab影象處理-亮度(灰度)變換問題

亮度(灰度)變換是一種非常重要的空間域內處理影象的方法,主要介紹幾個亮度變換函式,以及應用。

函式簡介

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

    :決定曲線的形狀,對gamma不同的值,如下圖所示,預設引數為1.
    Paste_Image.png

注意
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的灰度級壓縮為較亮範圍內。
    變換影象如圖所示
    Paste_Image.png

例項分析

我們自己寫一個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);