直⽅图均衡化、⾃适应直⽅图均衡化
⼀、直⽅图均衡化
简述
直⽅图均衡化的英⽂名称是:Histogram Equalization.
图像对⽐度增强的⽅法可以分成两类:⼀类是直接对⽐度增强⽅法;另⼀类是间接对⽐度增强⽅法。直⽅图拉伸和直⽅图均衡化是两种最常见的间接对⽐度增强⽅法。直⽅图拉伸是通过对⽐度拉伸对直⽅图进⾏调整,从⽽“扩⼤”前 直⽅图均衡化处理的“中⼼思想”是把原始图像的灰度直⽅图从⽐较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直⽅图均衡化就是对图像进⾏⾮线性拉伸,重新分配图像像素值,使⼀定灰度范围内的像素数量⼤致相 缺点:
1)变换后图像的灰度级减少,某些细节消失;
2)某些图像,如直⽅图有⾼峰,经处理后对⽐度不⾃然的过分增强。
数学原理
假定变换函数为:
由上述推导可知ps(s)(输出灰度级的概率密度函数)是均匀为1的,换句话说就是由变换函数得到的图像的灰度级是等概率的。⽽且,注意到这变换函数是⼀个累积分布函数(CDF)。
那么在计算灰度级为离散图像时,我们⽤每个灰度值在整幅图像中出现的频率作为该灰度值的概率,因此离散形式的均衡化变换成为以下形式:
算法实现
function [output_img] = my_HistEqual( input_img )
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
% 图像直⽅图均衡化处理函数
[height,width,channels]=size(input_img);
if channels==1
src = inpit_img;
else
src = rgb2gray(input_img);
end
%1.像素灰度统计
NumPixel = zeros(1,256);
for i=1:height
for j=1:width
grayValue = src(i,j);
NumPixel(1,grayValue+1) = NumPixel(1,grayValue+1)+1;
end
end
%2.计算灰度分布密度
ProbPixel = zeros(1,256);
for k=1:256
ProbPixel(1,k)=NumPixel(1,k)/(height*width*1.0);
end
%3.计算累积分布密度
CumuPixel = zeros(1,256);
CumuPixel(1,1) = ProbPixel(1,1);
for l=2:256
CumuPixel(1,l) = CumuPixel(1,l-1)+ProbPixel(1,l);
end
CumuPixel = uint8(255 .* CumuPixel + 0.5); %取整数
%4.计算灰度值映射
output_img = zeros(height,width);
for m=1:height
for n=1:width
output_img(m,n) = CumuPixel(src(m,n));
end
end
output_img = uint8(output_img);
end
⼆、⾃适应直⽅图均衡化
简述
⾃适应直⽅图均衡化直⽅图,然后重新分布亮度来来改变图像对⽐度。因此,该算法更适合于改进图像的局部对⽐
局部直方图均衡化
算法思想
移动模板W在图像A上逐⾏移动,并且模板W的中⼼c(x0,y0)对应图像上的点f(x0,y0);计算模板W区域的直⽅图均衡化变化关系:g(x,y)= T(f(x,y),计算模板中⼼点c(x0,y0)的均衡化对应像素值:
g(x0,y0) = T(f(x0,y0))。⽤g(x0,y0)替代f(x0,y0);逐⾏计算得到整幅图像的⾃适应直⽅图均衡化图像。
算法实现
function [ output_img ] = my_AHE( input_img, w)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
% ⾃适应直⽅图均衡化
% 输⼊:input_img:待处理图像
% w: 局部处理的窗⼝⼤⼩
[height,width,channels]=size(input_img);
if channels==1
src = inpit_img;
else
src = rgb2gray(input_img);
end
%1.图像边界扩展
padsize=[(w-1)/2,(w-1)/2];
padSrc = padarray(src,padsize,'symmetric','both');
%2.循环求解每个区域对应的值
output_img = zeros(height,width);
iter = 0;
for i=1:height
for j=1:width
slideWindow = zeros(w,w);
slideWindow = padSrc(i:i+w-1,j:j+w-1);
AHE_piexl = my_AHE_piexl(slideWindow,src(i,j));
output_img(i,j) = AHE_piexl;
iter = iter+1;
disp(iter);
end
end
output_img = uint8(output_img);
end
function [ outPiexl ] = my_AHE_piexl( window,inPiexl )
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
% 计算局部图像的直⽅图均衡化的像素对应值
% 输⼊:window: 局部图像
% inPiexl:输⼊像素
% outPiexl:输出像素
[height,width]=size(window);
%1.像素灰度统计
NumPixel = zeros(1,256);
for i=1:height
for j=1:width
grayValue = window(i,j);
NumPixel(1,grayValue+1) = NumPixel(1,grayValue+1)+1; end
end
%2.计算灰度分布密度
ProbPixel = zeros(1,256);
for k=1:256
ProbPixel(1,k)=NumPixel(1,k)/(height*width*1.0);
end
%3.计算累积分布密度
CumuPixel = zeros(1,256);
CumuPixel(1,1) = ProbPixel(1,1);
for l=2:256
CumuPixel(1,l) = CumuPixel(1,l-1)+ProbPixel(1,l);
end
CumuPixel = uint8(255 .* CumuPixel + 0.5); %取整数
%4.计算灰度值映射
outPiexl = CumuPixel(inPiexl);
end
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论