數字影像處理實驗之對比度拉伸

Space_walk發表於2019-07-17

一幅影像中,最高灰度級和最低灰度級的差成為對比度。一幅低對比度的影像,看起來細節會少很多。可以通過對比度拉伸提高影像對比度,顯示更多細節。先來看看對比度拉伸的典型變換:
對比度拉伸典型變換
書本中(岡薩雷斯:數字影像處理第三版P69)的對比度拉伸變換函式圖是這樣的:

書中對比度拉伸變換函式圖
圖3.10(b)低對比度拉伸圖中,最低灰度級為91,最高灰度級為138,並且要將灰度值拉伸至[0, 255]。閾值處理的函式的影像即為P64圖3.2第二個影像,其中k = 109。
實驗程式碼如下:

% 讀入影像
img_1 = imread('Fig0310(b)(washed_out_pollen_image).tif');

% max():返回一個行向量,向量的第i個元素是矩陣A的第i列上的最大值。
% 再一次即可求得最高灰度級
r_max = max(max(img_1));
%max() 同理
r_min = min(min(img_1));

% 求輸入影像的尺寸
[r, c] = size(img_1);

% 生成兩張0圖,一張用於對比度拉伸,一張用於閾值處理
img_2 = zeros(r, c);
img_3 = zeros(r, c);

% 將輸入影像轉換成double型
img_1s = double(img_1);

% 計算斜率
k = (255 - 0) / (r_max - r_min);
% 灰度級總和
sum = 0;

for x = 1 : r
    for y = 1 : c
        % 對每個畫素點進行拉伸,並賦值到新影像
        img_2(x, y) = k * (img_1s(x, y) - r_min);
        % 求灰度級總和
        sum = sum + img_1s(x, y);
    end
end

% 求閾值,這裡閾值為平均值
avg = sum / (r * c);

% 閾值處理
for x = 1 : r
    for y = 1 : c
        % 小於閾值賦值0
        if img_1s(x, y) < avg
             img_3(x, y) = 0;
         % 大於閾值賦值1
        else
            img_3(x, y) = 1;
        end
    end
end

% 轉換
img_2 =  im2uint8(mat2gray(img_2));
img_3 =  im2uint8(mat2gray(img_3));
% 顯示
subplot(131), imshow(img_1);
subplot(132), imshow(img_2);
subplot(133), imshow(img_3);

結果如下:
結果對比

相關文章