直方图均衡化 matlab

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('局部直方图均衡化后图像 及对应 直方图')


直方图均衡化是一种用于增强图像对比度的方法。对于灰度图像,可以使用histeq()函数进行直方图均衡化。对于彩色图像,可以将图像分成RGB三个通道,分别对每个通道进行直方图均衡化,然后再合成为一张彩色图像。以下是一个在Matlab中实现直方图均衡化的示例代码: ```matlab Img = imread('a1.jpg'); OutImg = Img; % 分别提取三通道的信息 R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); % 分别对三通道的图片进行直方图均衡化 R = histeq(R, 256); G = histeq(G, 256); B = histeq(B, 256); % 最后合成为一张图片 OutImg(:,:,1) = R; OutImg(:,:,2) = G; OutImg(:,:,3) = B; % 显示原始图像和均衡化后的结果 figure, subplot(1,2,1), imshow(Img); title('原始图像'); subplot(1,2,2), imshow(OutImg); title('均衡化后结果'); ``` 这段代码首先读取了一张彩色图像,然后将图像分成RGB三个通道。接下来,对每个通道的图像使用histeq()函数进行直方图均衡化。最后,将三个通道的均衡化结果合成为一张彩色图像,并显示原始图像和均衡化后的结果。 希望这个示例能够帮助到你。 #### 引用[.reference_title] - *1* *2* *3* [MATLAB--数字图像处理 图像直方图均衡化](https://blog.csdn.net/weixin_44225182/article/details/100518872)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值