MATLAB图像处理-局部直方图均衡化(附代码)
局部直方图均衡化也就是对一个像素周围的区域进行直方图均衡化,然后将结果返还给最中心的区域,需要自己确定模板的大小,一般都是奇数行,奇数列,运算时间较长,且模板越大,运算时间越长。在某种意义上,像素被基于整幅图像的灰度分布的变换函数修改。虽然这种全局方法适用于整个图像的增强,但存在这样的情况,增强图像中小区域的细节也是需要的。这些区域中,一些像素的影响在全局变换的计算中可能被忽略了,因为全局变换..
局部直方图均衡化也就是对一个像素周围的区域进行直方图均衡化,然后将结果返还给最中心的区域,需要自己确定模板的大小,一般都是奇数行,奇数列,运算时间较长,且模板越大,运算时间越长。
在某种意义上,像素被基于整幅图像的灰度分布的变换函数修改。虽然这种全局方法适用于整个图像的增强,但存在这样的情况,增强图像中小区域的细节也是需要的。这些区域中,一些像素的影响在全局变换的计算中可能被忽略了,因为全局变换没有必要保证期望的局部增强。解决方法是以图像中每个像素的邻域中的灰度分布为基础设计变换函数。
这种直方图处理技术很容易适应局部增强。该过程是定义一个邻域,并把该区域的中心从一个像素移至另一个像素。在每一个位置,计算邻域中的点的直方图,并且得到的不是直方图均衡化,就是规定化变换函数。这个函数最终用于映射邻域中心像素的灰度。然后,邻域中心的被移至一个相邻像素位置,并重复该过程。当邻域进行逐像素平移时,由于只有邻域中的一行或一列改变,所以可在每一步移动中,以新数据更新前一个位置得到的直方图。这种方法与区域每移动一个像素位置就计算邻域中所有像素的直方图相比有明显的优点。
编写的代码如下:
程序中,选用的模板大小为11*11,且直方图程序为自己编写,也可以替换为官方函数histeq(),直方图代码思路及过程可参见直方图均衡化(自己编写函数)
注:其中的直方图均衡化函数为自己编写,也可以使用官方函数,但是效果是一样的
clc
clear;
I=imread('/path.tif'); %读取图像
figure(1);
imshow(I);
title('原图象'); %显示原始图象
%%
%建立模板
size_moban=11;
length = floor(size_moban/2);
a(1:size_moban,1:size_moban)=1;%模板小于图像
image=wextend('2D','sym',I,size_moban);%%扩展
%%
[M,N] = size(image);%%扩展后的图像大小
W = double(image);
result = W;
for i=1+size_moban:M-size_moban
for j=1+size_moban:N-size_moban
m=W(i:i+(size_moban-1),j:j+(size_moban-1)).*a(1:size_moban,1:size_moban); %取出x1中从(i,j)开始的n行n列元素与模板相乘
k=hist_1(uint8(m));%对局部进行直方图均衡
after=double(k);
result(i,j)=after(1+length,1+length); %将均衡后中心点的像素值赋给原图对应点的元素,未被赋值的元素取原值
end
end
Picture=result(size_moban+1:M-size_moban,size_moban+1:N-size_moban);%%均衡化后,取原图像大小
Picture=uint8(Picture);
figure;
imshow(Picture);
title('变化后的图像'); %显示均衡后的图象
%%
%直方图均衡化程序
function hist_img = hist_1(I)
[M, N] = size(I);
size_img = M*N;
c = zeros(1,256);%统计每个每个像素值的个数
b= c;%转化前后的对照表
temp = I(:);
temp = sort(temp);
for i = 1:size_img
c(temp(i)+1) = c(temp(i)+1)+1;
end
a = c;%求和
for i = 2:256
a(i) = c(i) + a(i-1);
end
min_cdf = 10000;
for i = 1:256
if a(i)>0
if a(i) < min_cdf
min_cdf = a(i);
end
end
end
for j = 1:256
if a(j) > 0
b(j) = round(255*(a(j)-min_cdf)/(size_img-min_cdf));
end
end
for i = 1:M
for j = 1:N
I(i,j) = b(I(i,j)+1);
end
end
hist_img = I;
end
效果如下:
从图片中可以看出,细节部分很明显,可以通过调整模板来得到不同的效果。
参考链接:直方图均衡化(自己编写函数)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)