1. 程式人生 > >區域性直方圖均衡化 Matlab版

區域性直方圖均衡化 Matlab版

步驟:1、確定模板大小 n*n

     2、將影象進行擴充套件,因為對邊界處的處理會使得影象無法與模板達到一一對應。

    3、從影象的第一個畫素開始,與模版點乘,點乘後的區域性區域進行直方圖均值化,並將區域性的中心元素的作為影象的當前值

程式碼如下:

clear;
close all;
img=imread('C:\Users\Administrator\Desktop\復件 BN1121.bmp');
figure,imshow(img);
title('原始影象');


%構建模板
n=15;
model(1:n,1:n)=1;%a為n*n大小的模板,畫素值為1
%對原圖進行擴充套件,因為模板中心從影象的第一個畫素開始,模板必然有點在影象外,無對應點,所以進行擴充套件,是的影象一一對應
imgTend=wextend('2D','sym',img,n);
tendTrans=double(imgTend);%變成double型便於後期的點乘計算
[row,col]=size(imgTend);%獲取擴充套件後的影象的大小
tendTransTmp=tendTrans;
%model(a:b,c:d)表示A矩陣的第a到b行,第c到d列的所有元素
for i=n+1:row-n
    for j=n+1:col-n %因為進行了擴充套件,所以原影象的第一個畫素在擴充套件後的影象中對應的是(n+1,n+1)這個點
        modelResult=tendTrans(i:i+(n-1),j:j+(n-1)).*model(1:n,1:n);%在影象中取n*n大小,與模板對應點乘,生成點乘後的n*n大小的矩陣m
        modelEpual=histeq(uint8(modelResult));%對區域性m進行直方圖均衡化
        %k=histeq(m);%對塊圖進行直方圖均衡,m為double型,所以其k就是全1,那麼x2中對應的位置也就是全1,最後顯示轉化成uint8顯示肯定為黑色。
        equalTmp=double(modelEpual);%k仍為n*n大小的矩陣
        tendTransTmp(i,j)=equalTmp(8,8);%將均衡後的中心點的畫素值賦給原圖對應點的元素
    end
end
%未被賦值的元素取原值
result=tendTransTmp(n+1:row-n,n+1:col-n);%均衡化後取原影象大小
result=uint8(result);
%d=uint8(x2);
figure,imshow(result);
title('均衡後的影象');
imwrite(result,'C:\Users\Administrator\Desktop\BN1121.bmp');