原文地址: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
原图
原图直方图
变换后的直方图
最后的结果