原文地址:http://www.cnblogs.com/tiandsp/archive/2012/12/19/2825418.htmlhtml
直方圖匹配或叫作直方圖規定化均可以,是把原圖像的直方圖按照給定的直方圖加以映射,使新圖像的直方圖的分佈相似於給定的函數。函數
總共有如下幾步:ui
1.求給定的函數的累積直方圖s。spa
2.求原圖像的累積直方圖G。3d
3.求s中每個值在G中距離最小的位置index。code
4.求原圖像每一個像素經過index映射到的新像素的值。htm
代碼以下:blog
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)) %新圖的直方圖
效果以下:索引
給定的直方圖it
原圖
原圖直方圖
變換後的直方圖
最後的結果