数字图像处理Matlab-灰度直方图及直方图均衡化(附代码)

1.Objectives:

1、 熟悉灰度直方图的概念及计算方法;
2、 熟悉直方图均衡化的计算过程;
3、 计算并绘制图像直方图,实现直方图均衡化。

2.Experiment Content:

学习使用函数 imhist, histeq, bar, stem, plot, imadjust,及title, axis, set等描述图像工具。

3.Experiment Principle:

1.直方图:直方图定义就是一个离散函数 h(rk)=nkrk是区间内的第k级灰度,nk为图像中出现这种灰度级的像素数,可以用bar stem plot三种方式显示出来‚

2.直方图均衡:其实均衡就是一个累计分布函数(CDF)
在这里插入图片描述
其中Sk输出图像的灰度值 rk是输入的灰度值,nj是在某个灰度值的像素点的个数,n是整个像素点的个数。

下面我用一个例子说明如何进行直方图的均衡的

假设有9个像素点的一幅图
在这里插入图片描述
我们从上面的表格中可以发现 原来的20 30 40 的灰度值相隔很近,不容易用肉眼辨别 均衡后 变成了85 170 255 拉大了灰度值的差别 从而增加了对比度

4.Experiment Steps Result and Conlusion:

(1)直方图显示
在这里插入图片描述
图1 直方图表示
Con:从图中看出,整体的图片相对比较暗,因此灰度主要集中在100值的一片

(2)分别用bar 和stem 函数显示直方图

用plot 函数显示直方图 由 h=imhist 获得直方图;分别用bar 和stem 显示直方图h,并通过参数调整,改变直方图的显示方式。用axis 设置轴的最大、最小值(例如:axis([0 255 0 15000]);),用set 设置显示坐标的间隔(例如: set(gca,’xtick’, 0:50:255))
在这里插入图片描述
图2 用bar,stem,plot显示直方图
Con:这里的直方图统计分成了25块,因此不像上次图那么密,可以明显看到100值处的像素点特别多,因为主要都集中在那里,并且有把集中在那里的大概10个灰度值的像素点都加在了一起,因此数据量特别大。坐标的设置都是用了一些matlab中的函数工具。

(3)用imadjust 函数调整图像对比度,并用imhist 查看调整前后直方图的变化
在这里插入图片描述
图3用imadjust 函数调整图像对比度

两张图都是对图片的灰度进行了处理 设置的变化范围都是0-1
对于第一张图 gamma<1,图像变亮 后面的直方图也汇聚在高亮度值150附近
对于第一张图 gamma>1,图像变暗 后面的直方图也汇聚在高亮度值45附近
(4)用histeq 进行直方图均衡化,并用imhist 查看均衡化前后直方图的变化。
在这里插入图片描述
图4 用histeq 进行直方图均衡化

Con:均衡的目的是提高的对比度,亮的更亮,暗的更暗,从结果来看,爱恩斯坦背后的书更清晰了,说明对比度的提高能帮我们“看清”东西。但对人的处理还不如之前,说明还是要根据实际情况来进行相应的处理的。另外看直方图这边,原来低亮度 高亮度的地方都没有像素点 均衡化之后,几乎布满了整个灰度区域,说明对原来图像的亮度范围进行了拉伸。像素点的亮度集中在高亮度区域。

(5)用模糊算法进行亮度均衡,利用相应函数获得以下结果
在这里插入图片描述
图5 用模糊算法进行亮度均衡

Con:使用addpath添加相应的.p文件,便于之后使用fuzzysysfcn函数,明显可以看出模糊处理后的图像效果很好,更加清晰真实。

5.Appendix(programs and images):

代码:

clear all;clc;
f=imread('E:\数字图像处理\程序与图像\图像库\EINSTEIN.tif');
figure(1);
subplot(1,2,1);
imshow(f);
title('EINSTEIN');
subplot(1,2,2);
imhist(f);%画出直方图
axis([0 255 0 40000]);%为直方图设置坐标轴  

figure(2);
subplot(2,2,1);
h=imhist(f,25);%这个25参量的意思是共有25个容器 就是把255个灰度值分成25个来进行统计
horz=linspace(0,255,25);%生成一个范围是0到255的向量,向量中有25个点,分别均匀排列
bar(horz,h);%y用bar方式显示直方图,h是直方图的信息 
axis([0 255 0 120000]);%设置xy轴标记的刻度 四个参数分别是x轴的起始刻度,终止刻度 轴的起始刻度,终止刻度
set(gca,'xtick',0:50:255) %gca是获得当前轴,然后在x轴上 每隔50个值标记刻度
set(gca,'ytick',0:20000:120000);%同上,不过是在y轴
title('bar 默认宽度');
subplot(2,2,2);
bar(horz,h,0.5);%y用bar方式显示直方图,h是直方图的信息 0.5这个参数是可以调整bar的宽度的信息 
axis([0 255 0 120000]);
set(gca,'xtick',0:50:255);
set(gca,'ytick',0:20000:120000);%同上
title('bar 0.5的宽度');
subplot(2,2,3);
stem(horz,h);%用杆状图绘制直方图
axis([0 255 0 120000]);
set(gca,'xtick',0:50:255)
set(gca,'ytick',0:20000:120000);%同上
title('stem');
subplot(2,2,4);plot(horz,h);%用plot绘制曲线图
axis([0 255 0 120000]);
set(gca,'xtick',0:50:255) 
set(gca,'ytick',0:20000:120000);%同上
title('plot'); 

figure(3);
subplot(2,2,1);
f1=imadjust(f,[0 1],[0 1],0.5);%f是输入的图像 第二、三个矩阵分别是变化前 变化后的范围 最后的值gamma是决定变化的函数是上凸还是下凹%大于1下凹,图像变暗,大于1上凸,图像变亮
imshow(f1);
title('gamma>1,图像变暗');%映射图像下凹,相应灰度级降低
subplot(2,2,2);
imhist(f1);
subplot(2,2,3);
f2=imadjust(f,[0 1],[0 1],2);
imshow(f2);
title('gamma<1,图像变亮');
subplot(2,2,4);
imhist(f2);

figure(4);
subplot(2,2,1);
imshow(f);
subplot(2,2,2);
imhist(f);
title('原图直方图');
subplot(2,2,3);
g=histeq(f,256);%求出原图直方图均衡后的图像中每个像素点的灰度数据
imshow(g);%显示原图直方图均衡后的图像
subplot(2,2,4);
imhist(g);%绘制出原图直方图均衡后的直方图
title('直方图均衡');  

addpath('E:\数字图像处理\程序与图像\dipum_toolbox_2.0.2(only run)');%添加相应的.p文件,便于之后使用fuzzysysfcn函数 

udark=@(z)1-sigmamf(z, 0.35, 0.5);%进行模糊处理的隶属度函数
ugray=@(z)triangmf(z, 0.35, 0.5, 0.65);
ubright=@(z)sigmamf(z, 0.5, 0.65);
udarker=@(z)bellmf(z, 0.0, 0.1);
umidgray=@(z)bellmf(z, 0.4, 0.5);
ubrighter=@(z)bellmf(z, 0.8, 0.9); 
outmf={udark; ugray; ubright};%表示输出模糊函数
rules={udarker; umidgray; ubrighter}; %表示输入
F=fuzzysysfcn(outmf, rules, [0,1]); %使用
fuzzysysfcn函数及逆行模糊处理
z=linspace(0, 1, 256);%产生0-1范围内的指定数量点数,等分为256份,并返回一个行向量。
T=F(z);
I=f;
g=intrans(I, 'specified', T);
figure(5), imshow(g);%模糊处理的结果
figure(6), imshow(I);%原图
figure(7),plot(T);%灰度分布

结果:
在这里插入图片描述

在这里插入图片描述

发布了17 篇原创文章 · 获赞 12 · 访问量 1665

猜你喜欢

转载自blog.csdn.net/weixin_42784535/article/details/105121416