1. 程式人生 > >數字影象處理——直方圖均衡

數字影象處理——直方圖均衡

步驟:

1.求原影象的灰度分佈直方圖

2.根據灰度變換函式構建對映表

3.根據對映表生成均衡影象

Matlab程式碼:

clc,clear;
f = imread('river.jpg');
[h,w] = size(f);

% 求影象f的灰度分佈直方圖
hist1 = zeros(1,256);   % hist1為灰度分佈向量,0無法作為索引,索引1對應灰度值0
for row = 1:h
    for col = 1:w
        hist1(f(row,col)+1) = hist1(f(row,col)+1) + 1; 
    end
end
% 求直方圖均衡的變換函式
map_table = zeros(1,256);   % map_table為對映表,map_table[i+1]代表原來的灰度值i經過變換後的灰度值
cum_sum = 0;
for index = 1:256
    cum_sum = cum_sum + hist1(index);
    map_table(index) = (255/(h*w))*cum_sum;
end
% 根據直方圖均衡變換函式求均衡後的影象f1
f1 = zeros(h,w);  % 先初始化f1
for row = 1:h
    for col = 1:w
        f1(row,col) = map_table(double(f(row,col)+1));  % 先進行型別轉換,防止溢位
    end
end
% 上述迴圈等效於f1 = map_table(double(f)+1);
f1 = uint8(f1);
f2 = histeq(f); % 呼叫histeq()函式

% 顯示原影象,均衡後的影象,呼叫庫函式均衡後的影象
figure;
subplot(131),imshow(f),title('原影象');
subplot(132),imshow(f1),title('直方圖均衡後的影象');
subplot(133),imshow(f2),title('呼叫庫函式均衡後的影象');

% 顯示原影象,均衡後的影象,呼叫庫函式均衡後的影象的直方圖
figure;
subplot(131),imhist(f),title('原直方圖');
subplot(132),imhist(f1),title('均衡後的直方圖');
subplot(133),imhist(f2),title('呼叫庫函式均衡後的直方圖');

測試影象:

執行結果: