matlab練習程序(直方圖匹配)


  直方圖匹配或叫做直方圖規定化都可以,是把原圖像的直方圖按照給定的直方圖加以映射,使新圖像的直方圖的分布類似於給定的函數。

  總共有以下幾步:

  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))       %新圖的直方圖

效果如下:

給定的直方圖

原圖

原圖直方圖

變換后的直方圖

最后的結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM