灰度变化原理
灰度变换是对图像的每个像素按照灰度映射函数进行映射的变换,其作用于每个像素。灰度变换一般用来进行图像增强,提高图像的对比度,改善图像的灰度分布等。灰度变换根据灰度变换函数的不同分为线性函数变换、对数函数和幂函数变换。
直方图均衡化思想
直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。直方图均衡化方法的基本思想是对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。从而达到清晰图像的目的。
直方图均衡化改进思想
原来图上有很大一部分面积是背景墙、广告牌、地面。这些像素点的数目非常大,其次这些地方接近纯色。看一下均衡化的结果,这些区域确实增强啦,但是可惜不是我们需要的。其实,这种情况很普遍,图像的低频部分(比如背景墙壁,再比如风景图中的天空),其实不包含什么信息,我们也不希望这些区域被增强。既然算法是把很多我们不需要的区域给带进来了,那么要改进就把这些低频区域剔除出去嘛。剔除的标准是什么呢?我这里是用了求梯度的方法,很简单,就是说对于一个3×3小窗口内,用中心点上方的点值减去中心点下方的点值,用中心点左侧的点值减去中心点右侧的点值,如果他们的差大于一个阈值(我这里取10)那么就说明在这一中心点处有梯度。有梯度就是说图像有内容,值得关注,所以保留。而没有梯度就是说图像平坦,没有内容,需要剔除(值置为0)。
程序代码
f = imread('fractured_spine.tif');
subplot(3,2,1);imshow(f);
h = zeros(1,256);
[M,N] = size(f);
f = double(f);
for i = 1:M
for j = 1:N
h(f(i,j)+1) = h(f(i,j)+1) +1; %灰度值加一,h存储的是256个灰度值的像素点数
end
end
h = h/(M*N);%归一化
subplot(3,2,2);bar(h);%概率密度函数
c = zeros(1,256);%累积分布曲线
c(1)= h(1);
for k = 1:255
c(k+1) = c(k) +h(k+1);
end
hold on;plot(c);
f1 = zeros(M,N);
yu = 10; %采用梯度计算,设置阈值为10
for i = 2:M-1
for j = 2:N-1
test = f(i-1 : i+1,j-1:j+1); %3*3矩阵窗口
t1 = test(1,2) - test(3,2);%中心点上方-中心点下方
t2 = test(2,1) - test(2,3);%中心点左侧 -中心点右侧
if abs(t1) >yu ||abs(t2) >yu %绝对值大于阈值,说明图像保留
f1(i-1,j-1) = f(i-1,j-1);
end
end
end
g1 = zeros(M,N);
for i = 1:M %直方图均衡化
for j = 1:N
if f1(i,j) ~= 0
g1(i,j) = (c(f1(i,j)+1)); %将低灰度值拉高
else
g1(i,j) = f(i,j)/255;%灰度值为零的地方保持不变
end
end
end
subplot(3,2,3);imshow(g1); title('改进直方图均衡化');
subplot(3,2,4);imhist(g1);
g = zeros(M,N);
for i = 1:M %直方图均衡化
for j = 1:N
g(i,j) = c(f(i,j)+1); %将低灰度值拉高
end
end
subplot(3,2,5);imshow(g); title('直接直方图均衡化');
subplot(3,2,6);imhist(g);
实验结果