數字影象處理——直方圖匹配
阿新 • • 發佈:2018-11-21
步驟:
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('匹配後圖像的直方圖');
測試影象:
執行結果: