局部直⽅图均衡化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');