デジタル画像処理実験1:画像階調レベル補正


Matlabベースの画像階調補正
  • DIP実験1:画像階調補正
  • 実験目的
  • 実験内容
  • 参照コード
  • 1、呼び出しMatlab付帯関数作成
  • 2、自己作成の線形引張関数、べき乗則変換関数、描画ヒストグラム関数、等化関数
  • を用いる.
  • 実験結果
  • DIP実験1:画像階調補正
    実験の目的
    よく使われる画像階調補正方法(階調変換法とヒストグラム等化)を把握し,ヒストグラムの理解を深める.画像の増強効果を観察し,階調補正前後の画像を比較した.
    実験内容
    1)プログラムは画像の階調変換を実現し、画像の入出力マッピングパラメータ範囲(線形延伸と反比例)を変更する.2)パラメータの修正γ\gamma γ値(より大きい、より小さい、1に等しい)は、処理結果を観察する.3)画像ヒストグラムを等化処理し、等化前後の画像とそのヒストグラムを表示する.
    添付:参考になるMatlab関数は、imread、imadjust、imhist、stretchlim、histeq、imshow、axis
    出力画像の配置形式は以下の通りです.
    オリジナル画像
    せんけいひっぱりず
    反比例画像
    γ\gamma γ>1
    γ\gamma γ=1
    γ\gamma γ<1
    げんぞうヒストグラム
    等化された画像
    等化画像のヒストグラム
    リファレンスコード
    1、Matlabの自己関数作成を呼び出す
    %       
    org_img = imread('lena.bmp');   %original picture
    
    figure('NumberTitle', 'off', 'Name', '  1:       '); 
    
    subplot(3,3,1);
    imshow(org_img);
    title('   ');
    
    subplot(3,3,2);
    linear_img = imadjust(org_img,[0.2 0.5],[0 1]);  
    imshow(linear_img);
    title('      ');
    
    subplot(3,3,3);
    inv_img = imadjust(org_img,[0 1],[1 0]);  
    imshow(inv_img);
    title('    ');
    
    subplot(3,3,4);
    gmbig = imadjust(org_img,[ ],[ ],2);  
    imshow(gmbig);
    title('\gamma > 1');
    
    subplot(3,3,5);
    gmeq = imadjust(org_img,[ ],[ ],1);  
    imshow(gmeq);
    title('\gamma = 1');
    
    subplot(3,3,6);
    gmsmall = imadjust(org_img,[ ],[ ],0.5);  
    imshow(gmsmall);
    title('\gamma < 1');
    
    subplot(3,3,7);
    imhist(org_img);
    title('      ');
    
    subplot(3,3,8);
    adh_img = histeq(org_img);  
    imshow(adh_img); 
    title('      ');  
    % histeq adapthisteq ?
    
    subplot(3,3,9);  
    imhist(adh_img);
    title('        ');  
    
    

    2、自分で作成した線形引張関数、べき乗則変換関数、ヒストグラム描画関数、等化関数
    figure('NumberTitle', 'off', 'Name', '  1:       '); 
    OrgImg = imread('lena.bmp');   %       
    
    subplot(3,3,1);
    imshow(OrgImg);
    title('   ');
    
    subplot(3,3,2);
    LinearImg = LinearEnhance (OrgImg, [0.5 0.8], [0 1]);   
    imshow(LinearImg);
    title('      ');
    
    subplot(3,3,3);
    InverseImg = LinearEnhance (OrgImg, [0 1], [1 0]);
    imshow(InverseImg);
    title('    ');
    
    subplot(3,3,4);
    PowerLaw1 = PowerLawTrans (OrgImg, 1, 2);
    imshow(PowerLaw1);
    title('\gamma > 1');
    
    subplot(3,3,5);
    PowerLaw2 = PowerLawTrans (OrgImg, 1, 1);
    imshow(PowerLaw2);
    title('\gamma = 1');
    
    subplot(3,3,6);
    PowerLaw3 = PowerLawTrans (OrgImg, 1, 0.5);
    imshow(PowerLaw3);
    title('\gamma < 1');
    
    subplot(3,3,7);
    OrgHist = Histo(OrgImg);
    bar(0:255, OrgHist, 'b'); 
    title('      ');
    
    subplot(3,3,8);
    EquImg = Equalization(OrgImg, OrgHist);
    imshow(EquImg); 
    title('      ');  
    
    subplot(3,3,9);  
    OrgHist2 = Histo(EquImg);
    bar(0:255, OrgHist2, 'b'); 
    title('        ');  
    
    
    %        LinearEnhance
    function TransImg = LinearEnhance (OrgImg, RangeIn, RangeOut)
        % OrgImg     
        % RangeIn          ,a、b  0 1  
        % RangeOut          ,c、d,  0 1  
        a = RangeIn(1);
        b = RangeIn(2);
        c = RangeOut(1);
        d = RangeOut(2); 
        if (a < 0 || b > 1 || c < 0 || d > 1)   %      
            error('        ');
        end
        img = im2double(OrgImg);    
        k = (d - c) / (b - a);   %       
    %     a = min(img(:));
    %     b = max(img(:));
        TransImg = ones(256);
        for i = 1 : 256
            for j = 1 : 256
                if (img(i,j) < a)
                    TransImg(i,j) = c;
                elseif (img(i,j) >= a && img(i,j) < b)
                    TransImg(i,j) = k * img(i,j) + c;
                else 
                    TransImg(i,j) = d;
                end
            end
        end
        TransImg = mat2gray(TransImg);
    end
    
    
    %        PowerLawTrans
    function TransImg = PowerLawTrans (OrgImg, c, gamma)
        % OrgImg     
        img = im2double(OrgImg);
        TransImg = c * (img .^ gamma) ;
        TransImg = mat2gray(TransImg);
    end
    
    %         Histo
    function TransImg = Histo(Img)
        TransImg = zeros(1,256);  
        for i = 0: 255
            TransImg(i + 1) = length(find(Img == i)) / (256 * 256);  
        end
    end
    
    %      Equalization
    function TransImg = Equalization(Img, p)
        % p          
        s = zeros(1,256);
        for i = 1 : 256  
            for j = 1: i  
                 s(i) = p(j) + s(i);                
            end  
        end  
        a = round(s * 255);     % round     
        TransImg = Img;
        for i = 0 : 255  
            TransImg(find(Img == i)) = a(i+1);                
        end  
    end
    

    じっけんけっか