MATLAB下直方图均衡化算法的改进及代码实现

前言

在博文https://blog.csdn.net/u012590570/article/details/50347687?tdsourcetag=s_pctim_aiomsg中,博主对传统直方图均衡化算法进行了改进,改进后的算法剔出了图像中原来存在的低频信息,对高频信息进行了很好的保留,取得了很好的效果,在本篇博文中,我将使用MATLAB复现原作者提出的算法。

代码

clc;clear;close all
%% 读取图像
% I = imread('test.jpg');
I=rgb2gray(imread('test5.jpg'));
Ib = I;
[m,n] = size(I);
T = 10;%阈值
I2 = padarray(I,[1,1], 'symmetric');
%% 改进直方图均衡化
I_sub = zeros(size(I));
for i = 2:size(I2,1)-1
    for j = 2:size(I2,2)-1
        win = I2(i-1:i+1,j-1:j+1);
        t1 = win(1,2)-win(3,2);
        t2 = win(2,1)-win(2,3);
        if abs(t1)>T || abs(t2)>T
            I_sub(i-1,j-1) = I(i-1,j-1);
        end
    end
end
% imshow(I_sub,[])
[nk,sk]=imhist(uint8(I_sub));
t = nk(1);
nk(1) = [];sk(1) = [];
pdf=nk/(m*n-t);      %计算原始图像每个灰度级出现的概率

cdf=cumsum(pdf);   %计算原始图像累计分布概率
N=max(sk);
a=size(sk);
tk=round(((N-1)*cdf+0.5));
[nk2,sk2]=imhist(uint8(I));
for i = length(sk2):-1:2
    I(I==sk2(i)) = tk(i-1);
end
figure,
subplot(131)
imshow(Ib),title("原图");
subplot(132)
imshow(histeq(Ib)),title("直方图均衡化的结果")
subplot(133)
imshow(I),title("改进之后的结果")

你可能感兴趣的:(matlab,matlab,计算机视觉,图像识别)