原理參看下圖,直方規範化的理論思路。
離散情況,參看下一個圖,介紹實際圖像中,直方規範化的步驟,看懂即可。
算法步驟:(具體可參看源碼中註釋)
1. 讀取標準圖像變成灰度圖像,得到累計直方圖
2. 讀取原圖變成灰度圖像,得到累計直方圖
3. 比較每個灰度級,得到映射關係:方法找到兩個累積直方圖距離最近的點
4. 原圖灰度映射到新的灰度
clear all;
close all;
% 擴展原圖像形成中間圖像的高斯濾波
orgin=imread('lena.jpg');
orgin=rgb2gray(orgin); %讀入原圖像
[m_o,n_o]=size(orgin);
orgin_hist=imhist(orgin)/(m_o*n_o);
standard = imread('1.jpg');% 讀入標準圖
standard=rgb2gray(standard);
[m_s,n_s]=size(standard);
standard_hist=imhist(standard)/(m_s*n_s);
startdard_value=[]; % 標準圖累積直方
orgin_value=[]; % 原圖像累積直方
for i=1:256
startdard_value=[startdard_value sum(standard_hist(1:i))];
orgin_value=[orgin_value sum(orgin_hist(1:i))];
end
for i=1:256
value{i}=startdard_value-orgin_value(i);
value{i}=abs(value{i});
[temp index(i)]=min(value{i});
end
newimg=zeros(m_o,n_o);
for i=1:m_o
for j=1:n_o
newimg(i,j)=index(orgin(i,j)+1)-1;
end
end
newimg=uint8(newimg);
subplot(2,3,1);imshow(orgin);title('原圖');
subplot(2,3,2);imshow(standard);title('標準圖');
subplot(2,3,3);imshow(newimg);title('myself匹配到標準圖');
subplot(2,3,4);imhist(orgin);
title('原圖');
subplot(2,3,5);imhist(standard);
title('標準圖');
subplot(2,3,6);imhist(newimg);
title('myself匹配到標準圖');