clear
clc
close all
img = imread('1.png');
img =rgb2gray(img);
% 获取各灰度级 对应的 个数 及在整个图像中所占的比例
temp =zeros(256,6);
[m,n] =size(img);
% 调整直方图均衡化后的灰度级上下限
top = 100;% 灰度级上限
low = 50;% 灰度级下限
if top -low>255
error('灰度级上下限错误')
end
figure;
imhist(img)
% 调整直方图均衡化后的合并函数
% y = @(x) round(x); % 采用四舍五入
% y = @(x) floor(x); % 采用向下取整 和四舍五入区别不大
% y = @(x) floor(x)+1; % 采用向上取整 和四舍五入区别不大
y = @(x) (top./(1+exp(-0.03.*(x-175))))+low;%采用S 型函数优化
%采用分段S 型函数优化
% y = @(x) (200<=x<256).*((56./(1+exp(-0.15.*(x-35))))+200)+...
% (100<=x<200).* ((100./(1+exp(-0.1.*(x-150))))+100)+...
% (0<x<100).*(100./(1+exp(-0.1.*(x-55))))-300;
%根据直方图分布 采用S 型函数优化
% y = @(x) (100<=x<150).*((50./(1+exp(-0.025.*(x-130)))+100));% 函数定义有问题
plot([0:256],y([0:256]));
hold on
plot(low,y(low),'r*');
hold on
plot(top,y(top),'r*');
ylim([0 255])
title('自定义映射函数曲线 ')
for i=low:1:top
temp(i+1,1) =i; % temp第一列 当前图像中的 灰度级
temp(i+1,2) = length(find(img==i));% temp第二列 当前图像中的 各灰度级个数
temp(i+1,3) = temp(i+1,2)/(m*n);% temp第三列 当前图像中的 各灰度级个数 在整个图像中的占比
temp(i+1,4) = sum(temp(:,3));% temp第四列 当前图像中的 各灰度级个数 在截至当前灰度级在整个图像中的占比的累计值
temp(i+1,6) = sum(temp( find(temp(1:i+1,5) == temp(i+1,5)),2));%temp第六列 新灰度级 当前新灰度级下的累积个值
end
low = low+1;% matlab 不从0开始索引
top = top+1;
% 用这个 自定义函数曲线表示的为 横坐标为原灰度 纵坐标为新灰度
% temp(low:top,5) = y(mapminmax(temp(low:top,4)',0,1)'.*(top-low)+(low-1));% temp第五列 表示累计值 与 最高灰度 相乘 得到新的灰度级 并通过四舍五入取整 至此采用新灰度将旧灰度值进行替换即可
% 用这个 自定义函数曲线表示的为 横坐标为原灰度值 纵坐标为原灰度值拉伸权重(这里做了归一化)
temp(low:top,5) = mapminmax(y(temp(low:top,4))',0,1)'.*(top-low)+(low-1);
figure;
imshow(img);title('原图像')
figure;
imhist(img);title('原图像对应直方图')
img1 = zeros(size(img));
temp(:,5)= floor(temp(:,5));
for i=low:top
img1(find(img == i-1)) = temp(i,5); % 采用新灰度将旧灰度值进行替换
end
img = double(img);%不在所选范围内的灰度值进行保留
if low ~= 0
img1(find(img<low)) = img( find(img<low));
end
img1(find(img>top)) = img( find(img>top));
img1= uint8(img1);
figure;
imshow(img1,[]);title('直方图均衡化后图像')
figure;
imhist(img1);title('直方图均衡化后图像对应直方图')
%% 这段为matlab 一些自带直方图均衡化效果 可以与上段分开运行
% 其中matlab 的程序都是优化后,所以一般效果会比常规实现好
clear
clc
close all % 这三句注释掉可以不清除上段内容
img = imread('1.png');
gray =rgb2gray(img);
J = histeq(gray);
figure;
imshow(gray);title('原图像')
figure;
imhist(gray);title('原图像对应直方图')
figure;
imshow(J);title('常规直方图均衡化后图像')
figure;
imhist(J);title('常规直方图均衡化后图像对应直方图')
J= imadjust(gray);
% gray是待进行 限制对比度 直方图均衡化的灰度图像
% J 为当前灰度图像进行 限制对比度 直方图均衡化的图像
figure
subplot(1,2,1)
imshow(J)
subplot(1,2,2)
imhist(J,64)
title('限制对比度直方图均衡化后图像 及对应 直方图')
J = adapthisteq(gray,'NumTiles',[31 31],'Range','original');
% gray是待进行局部性直方图均衡化的灰度图像
% 'NumTiles',[31 31] 表示局部区域的大小 可以自行调整
% J 为当前灰度图像进行局部区域直方图均衡化的图像
figure
subplot(1,2,1)
imshow(J)
subplot(1,2,2)
imhist(J,64)
title('局部直方图均衡化后图像 及对应 直方图')