直方圖匹配或叫做直方圖規定化都可以,是把原圖像的直方圖按照給定的直方圖加以映射,使新圖像的直方圖的分布類似於給定的函數。
總共有以下幾步:
1.求給定的函數的累積直方圖s。
2.求原圖像的累積直方圖G。
3.求s中每一個值在G中距離最小的位置index。
4.求原圖像每個像素通過index映射到的新像素的值。
代碼如下:
clear all; close all; clc; r=127; x=-r:r+1; sigma=20; y1=exp(-((x-80).^2)/(2*sigma^2)); y2=exp(-((x+80).^2)/(2*sigma^2)); y=y1+y2; %雙峰高斯函數,任意函數都可以 %im=imread('bg.bmp'); %匹配一個圖像的直方圖 %y=imhist(im); y=y/sum(y); %歸一化,使函數符合概率分布的sum(y)==1這樣一個規律 plot(y); %待匹配的直方圖 G=[]; %函數的累積直方圖 for i=1:256 G=[G sum(y(1:i))]; end img=imread('lena.jpg'); [m n]=size(img); hist=imhist(img); %待處理圖像的直方圖 p=hist/(m*n); figure;plot(p) %原圖直方圖 s=[]; %待處理圖像的累積直方圖 for i=1:256 s=[s sum(p(1:i))]; end for i=1:256 tmp{i}=G-s(i); tmp{i}=abs(tmp{i}); %因為要找距離最近的點,所以取絕對值 [a index(i)]=min(tmp{i}); %找到兩個累積直方圖距離最近的點 end imgn=zeros(m,n); for i=1:m for j=1:n imgn(i,j)=index(img(i,j)+1)-1; %由原圖的灰度通過索引映射到新的灰度 end end imgn=uint8(imgn); figure;imshow(imgn) figure;plot(imhist(imgn)) %新圖的直方圖
效果如下:
給定的直方圖
原圖
原圖直方圖
變換后的直方圖
最后的結果