matlab實現 線性拉伸某灰度影像的對比度 程式碼 對比度拉伸

喵喵喵blacktoday發表於2018-10-25

題目:定義一個影像的對比度拉伸函式,函式名為myGrayScaleTransform,將輸入影像的對比度線性平滑地拉伸到指定的灰度級區間,要求該函式的輸入引數包括處理前的灰度影像img1 (如EXP1A.tif)、期望灰度級的引數區間para,輸出引數為處理後的灰度影像img2。

定義函式為img2 = myGrayScaleTransform (img1, para),其中,引數para是一個長度為2的一維陣列,用於表示期望灰度級區間的最小值和最大值,要求最小和最大值的取值範圍限定在區間[0 255]之間,且最小值不能超過最大值,如指定區間為para = [50 120];線性平滑拉伸可以參考資料歸一化的計算原理。

 

實現思路:

1.定義函式:

              我們定義的函式有兩個引數:影像img1和灰度級區間最小值、最大值的二維陣列para。首先對para引數進行判斷,若灰度級的最大值和最小值不符合要求則報錯。

若輸入的引數沒有問題,就開始對影像進行處理:先使用im2double函式將uint8型別的影像資料轉換為double型別的,分別取影像矩陣的最大值和最小值,使用公式利用公式f=(img – min_i)/(max_i – min_i)把資料範圍壓縮到0~1之間的數值,即資料的歸一化,以便計算。再使用公式img2 = (b - a) .* img2 + a還原圖片畫素的大小為para區間內的數值,最後使用函式uint8將圖片資料轉換為uint8的格式,以便輸出。

2.測試函式:

使用imread函式讀取影像'EXP1A.tif';

分別定義灰度級para = [0,50]、 para = [50,120]、para = [150,250],並分別呼叫myGrayScaleTransform函式得到對比度拉伸後的影像;

          3.按題目要求顯示影像。

 

實現效果:

實現原始碼:

clc;
%讀取影像
img_a = imread('EXP1A.tif');

para = [0,50];
img_a2 = myGrayScaleTransform (img_a, para);

para = [50,120];
img_a3 = myGrayScaleTransform (img_a, para);

para = [150,250];
img_a4 = myGrayScaleTransform (img_a, para);

%顯示影像
figure('NumberTitle', 'off', 'Name', '實驗一第三題 EXP1A.tif 對比度拉伸'); 
subplot(2,2,1);
imshow(img_a);
title('原圖');

subplot(2,2,2);
imshow(img_a2);
title('0~50');

subplot(2,2,3);
imshow(img_a3);
title('50~120');

subplot(2,2,4);
imshow(img_a4);
title('150~250');
function img2 = myGrayScaleTransform (img1, para)
    a = para(1);
    b = para(2);
    if(a > b)
        error('para中引數,最小灰度值a不能超過最大灰度值b!');
    elseif(a < 0 || b > 250)
        error('para中引數,最小灰度值a和最大灰度值b的範圍在區間[0,250]之間!');
    end
    img = im2double(img1);%將uint8型別的資料轉換為double型別的同時,把資料範圍由原來的0~255對映到0~1,可以看作資料的一種歸一化,以便計算
    min_i = min(img(:));
    max_i = max(img(:));
    img2 = (img - min_i)./(max_i - min_i);%將圖片壓縮到0~1之間的數值
    img2 = (b - a) .* img2 + a;%還原圖片畫素的大小為para區間內的數值
    img2 = uint8(img2);%將圖片資料轉換為uint8的格式,以便輸出
end

 

相關文章