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

數字影象處理——直方圖匹配

步驟:

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

2.根據灰度變換函式分別構建原影象和匹配影象的對映表

3.根據單對映規則(最近對映)構建原影象到目標影象的對映表

4.根據對映表生成匹配影象

Matlab程式碼:

clear,clc;
f = imread('LENA.png');
f_ref = imread('EightAM.png');
[h1,w1] = size(f);
[h2,w2] = size(f_ref);

% 求影象f的灰度分佈直方圖
hist1 = zeros(1,256);   % hist1為灰度分佈向量,0無法作為索引,索引1對應灰度值0
for row = 1:h1
    for col = 1:w1
        hist1(f(row,col)+1) = hist1(f(row,col)+1)+1;    
    end
end
% 求直方圖均衡的變換函式
f_table = zeros(1,256);   % f_table為對映表,索引i代表灰度值+1,f_table[i+1]代表原來的灰度值i經過變換後的灰度值
cum_sum = 0;
for index = 1:256;
    cum_sum = cum_sum + hist1(index);
    f_table(index) = (255/(h1*w1))*cum_sum;
end

% 求影象f_ref的灰度分佈直方圖
hist1_ref = zeros(1,256);   % hist1_ref為灰度分佈向量,0無法作為索引,索引0對應灰度值1
for row = 1:h2
    for col = 1:w2
        hist1_ref(f_ref(row,col)+1) = hist1_ref(f_ref(row,col)+1)+1;    % 0無法作為索引,灰度值0對應下標1
    end
end
% 求直方圖均衡的變換函式
f_ref_table = zeros(1,256);   % f_ref_table為對映表,索引i代表灰度值+1,f_ref_table[i+1]代表原來的灰度值i經過變換後的灰度值
cum_sum = 0;
for index = 1:256;
    cum_sum = cum_sum + hist1_ref(index);
    f_ref_table(index) = (255/(h2*w2))*cum_sum;
end

% 以下四條語句等效於上述求兩幅影象的累計分佈函式
% hist1 = imhist(f);
% hist1_ref = imhist(f_ref);
% f_table = cumsum(hist1)/numel(f);
% f_ref_table = cumsum(hist1_ref)/numel(f_ref);

% 根據單對映規則構造對映表
map_table = zeros(1,256);
for index = 1:256
    [temp,ind] = min(abs(f_table(index)-f_ref_table));
    map_table(index) = ind-1;
end

% 根據對映表生成匹配後的影象
f_match = zeros(h1,w1);  % 先初始化f_match
for row = 1:h1
    for col = 1:w1
        f_match(row,col) = map_table(double(f(row,col)+1));  % 先進行型別轉換,防止溢位
    end
end
% 上述迴圈等效於f_match = map_table(double(f)+1);
f_match = uint8(f_match);

% 顯示原影象,匹配影象,匹配後的影象
figure;
subplot(1,3,1),imshow(f),title('原影象');
subplot(1,3,2),imshow(f_ref),title('匹配影象');
subplot(1,3,3),imshow(f_match),title('匹配後的影象');

% 顯示原影象,匹配影象,匹配後的影象的直方圖
figure;
subplot(1,3,1),imhist(f),title('原直方圖');
subplot(1,3,2),imhist(f_ref),title('匹配影象的直方圖');
subplot(1,3,3),imhist(f_match),title('匹配後圖像的直方圖');

測試影象:

原影象
匹配影象

執行結果: