📜  使用 MATLAB 进行图像处理中的自适应直方图均衡

📅  最后修改于: 2022-05-13 01:54:35.233000             🧑  作者: Mango

使用 MATLAB 进行图像处理中的自适应直方图均衡

直方图均衡是一种扩大直方图动态范围的数学技术。有时直方图跨越一个短范围,通过均衡化,直方图的跨度被加宽。在数字图像处理中,使用这种技术可以增强图像的对比度。

自适应直方图均衡:自适应直方图均衡是一种用于增强图像对比度的数字图像处理技术。它与普通直方图均衡的不同之处在于自适应方法局部增强了对比度。它将图像分成不同的块并计算每个部分的直方图均衡化。因此,AHE 计算了许多直方图,每个直方图对应于图像的不同部分。它增强了图像所有不同区域中的局部对比度和边缘定义。

好处:

  • 它计算图像不同部分的 HE。
  • 它保留了图像不同区域的边缘。
  • 它增强了局部对比度。

坏处:

AHE 会过度放大图像相对均匀区域中的噪声。为了防止这种情况,使用了一种称为对比度受限自适应直方图均衡 (CLAHE) 的自适应直方图均衡变体。

使用的函数:

  • imread( ) 是用于读取图像的内置函数。
  • size( ) 是用于获取图像大小的内置函数。
  • rgb2gray( ) 是用于将 RGB 图像转换为灰度图像的内置函数。
  • zeros(row, col) 是用于创建 row*col 零矩阵的内置函数。
  • unit8( ) 是用于将双精度值转换为整数格式的内置函数。
  • blockproc( ) 是内置函数,用于将 HE函数应用于图像的不同部分。
  • length() 是用于查找列表大小的内置函数。
  • imtool( ) 是用于显示图像的内置函数。
  • pause( ) 是用于暂停系统执行下一条语句的内置函数。
Matlab
% MATLAB code for Histogram equalisation
% function to return resultant
% image: Apply on single channel only.
function res_img=myhistEq(img)
Freq=zeros(1,256);
[x,y,z]=size(img);
  
% Convert into grayscale if 
% image is coloured.
if(z==3)
    img=rgb2gray(img);
end
  
% Calculate frequency of each
% intensity value.
for i=1:x
    for j=1:y
        Freq(img(i,j)+1)=Freq(img(i,j)+1)+1;
    end
end
  
% Calculate PDF for each intensity value.
PDF=zeros(1,256);
Total=x*y;
for i=1:256
    PDF(i)=Freq(i)/Total;
end
  
% Calculate the CDF for each intensity value.
CDF=zeros(1,256);
CDF(1)=PDF(1);
for i=2:256
    CDF(i)=CDF(i-1)+PDF(i);
end
  
% Multiply by Maximum intensity value
% and round off the result.
Result=zeros(1,256);
for i=1:256
    Result(i)=uint8(CDF(i)*(255));
end
  
% Compute the new image.
new_img=zeros(size(img));
for i=1:x
    for j=1:y
        new_img(i,j)=Result(img(i,j)+1);
    end
end
res_img=new_img;
end
  
%%%%% UTILITY CODE %%%%%%%%
fun=@(block_struct)myhisteq(block_struct.data);
  
%blockproc() is block processing function.
%it applies normal HE on distinct block of
%defines sizes [m n]
  
list=["hat_lady.jfif"];
for i=1:length(list)
    img=imread(list(i));
    AHEq=blockproc(img,[100 100], fun);
    %AHEq=blockproc(img,[200 200], fun);
    %AHEq=blockproc(img,[250 200], fun);
    %HEq=myhisteq(img);
    %imtool(HEq,[]);
    imtool(AHEq,[]);
    imtool(img,[]);
    pause(10);
    imtool close all;


输出:

当图像有极暗或极亮的斑点时,AHE 优于普通 HE。但是 AHE 倾向于过度放大图像接近恒定区域的对比度,因为这些区域的直方图高度集中。结果,AHE 可能导致噪声在接近恒定的区域中被放大。