直方图均衡化及matlab实现

在处理图像时,偶尔会碰到图像的灰度级别集中在某个小范围内的问题,这时候图像很难看清楚。比如下图:

它的灰度级别,我们利用一个直方图可以看出来(横坐标从0到255,表示灰度级别,纵坐标表示每个灰度级别的像素出现个数)

可以看出,上图是由于灰度级过于集中,导致图片难以看清。

这时候我们可以把灰度级别“拉开”,使得灰度级多且分布均匀,让图片具有高对比度和多变的灰度色调。

那么如何拉开才能使得灰度级别占据从0到255的整一个范围呢?

我们可以先利用概率,计算出原图中每一个灰度级别的像素个数占所有像素个数的比例,然后比例逐个灰度级别地累加,接着把累加比例乘以256,得出该灰度级别“拉开”之后应该在哪一个级别。

举一个例子,假设一张图片像素点对应的矩阵为

f=[100,100,100,100,100;
110,110,110,110,110;
120,120,120,120,120;
130,130,130,130,130;
140,140,140,140,140];

那么我们可以看到灰度级别为100的像素个数的比例为1/5,那么现在灰度级别应该改为round(1/5*256-1)。之所以-1是因为灰度级从0到255,取整是因为灰度级均为整数。

接下来110所占比例也是1/5,累加比例变成2/5,所以灰度级别应该是round(2/5*256-1)。

120对应的累加比例为3/5,就应该是round(3/5*256-1)

……

如此,就可以把灰度级拉开。拉开后直方图如下:

最后效果如下

最后附上matlab代码:

clear all;
clc;
close all;

f=imread(‘zftjhh1.jpg‘);
[m,n,d]=size(f);%灰度图1维,彩色图3维
if d==1
    f1=f;%复制后新的图片f1,作为改变后的图片
elseif d==3
    f=rgb2gray(f);
    f1=f;
end
figure
imhist(f)
[count,x]=imhist(f);%count表示每个灰度级别有多少个像素,x表示有多少个灰度级别

PDF=count/(m*n);%PDF表示每个灰度级别出现的概率,一共有256行
CDF=cumsum(PDF);%CDF表示逐行相加的概率,也就是累加概率

for i=1:256
    xiangsuxushu=find(f==i);%原本灰度级别为i的像素在第几位
    changdu=length(xiangsuxushu);
    for j=1:changdu
        f1(xiangsuxushu(j))=round(CDF(i)*256-1);%每一个原本灰度级别为i的像素,
                                              %灰度级别改为累加出现概率*256
                                              %再取整
    end
end

figure
imhist(f1)
figure
imshow(f1)

  

有做得不完善的地方欢迎留言探讨!

时间: 2024-11-06 23:37:28

直方图均衡化及matlab实现的相关文章

matlab 直方图均衡化

原理: 直方图均衡化首先是一种灰度级变换的方法: 原来的灰度范围[r0,rk]变换到[s0,sk]变换函数为:s=T(r); 为便于实现,可以用查找表(look-up table)的方式存储,即:原始的灰度作为查找表的索引,表中的内容是新的灰度值. 其次,直方图均衡化是图像增强的一种基本方法,可提高图像的对比度,即:将较窄的图像灰度范围以一定规则拉伸至较大(整个灰度级范围内)的范围. 目的是在得到在整个灰度级范围内具有均匀分布的图像. 所以,当输入:直方图H(r)[此处指每个灰度级占有的像素数]

直方图均衡化的计算以及MATLAB实现

直方图均衡,这里不写公式,只看怎么算 一.手算直方图均衡 例如一个矩阵 \[源矩阵= \left[ \begin{matrix} 4&4&4&4&4&4&4&0\4&5&5&5&5&5&4&0\4&5&6&6&6&5&4&0\4&5&6&7&6&5&4&0\4&5&6&

基于matlab的直方图均衡化代码

2007-04-15 20:15 clear all %一,图像的预处理,读入彩***像将其灰度化 PS=imread('1.jpg');                 %读入JPG彩***像文件 imshow(PS)                                  %显示出来 title('输入的彩色JPG图像') imwrite(rgb2gray(PS),'PicSampleGray.bmp'); %将彩***片灰度化并保存 PS=rgb2gray(PS);      

直方图均衡化(matlab)

对图像(灰度图)进行直方图均衡化主要有一下几个步骤: 1.计算各个灰度值(0-255)出现的次数 2.计算各个灰度值的累积分布率 2.根据累积分布率计算出原来各灰度值的均衡化之后的新的值 %直方图均衡化 clear; I = imread('1.bmp'); [height,width] = size(I); figure subplot(221) imshow(I)%显示原始图像 subplot(222) imhist(I)%显示原始图像直方图 %进行像素灰度统计; s = zeros(1,2

直方图均衡化会造成灰度级的合并【伪轮廓】

均衡化处理后的图象只能是近似均匀分布.均衡化图象的动态范围扩大了,但其本质是扩大了量化间隔,而量化级别反而减少了, 因此,原来灰度不同的象素经处理后可能变的相同,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓. 如果原始图像对比度本来就很高,如果再均衡化则灰度调和,对比度降低.在泛白缓和的图像中,均衡化会合并一些象素灰度,从而增大对比度.均衡化后的图片如果再对其均衡化,则图像不会有任何变化. 灰度直方图均衡化的算法,简单地说,就是把直方图的每个灰度级进行归一化处理,求每种灰

图像处理------直方图均衡化

一.直方图均衡化数学推导 直方图均衡化的总体思想:首先考虑连续函数并且让变量r代表待增强图像的灰度级,假设被归一化到区间[0,1],且r=0表示黑色及r=1表示白色.然后再考虑一个离散公式并允许像素值在区间[0,L-1]内. 对于连续函数而言,假设其变换函数为 s=T(r),  0=<r<=1 在原始图像中,对于每一个像素值r产生一个灰度值s.其中,变换函数要满足以下条件: (1)T(r)在区间中为单值且单调递增.这是为了保证其逆函数的存在,并且输出图像从黑到白顺序增加: (2)当0=<

数字图像处理-----直方图均衡化

直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等.这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果. 直方图是表示数字图像中每一灰度出现频率的统计关系.直方图能给出图像灰度范围.每个灰度的频度和灰度的分布.整幅图像的平均明暗和对比度等概貌性描述.灰度直方图是灰度级

彩色图像的直方图均衡化

彩色图像的直方图均衡化 - YangYudong2014的专栏 - CSDN博客 http://blog.csdn.net/yangyudong2014/article/details/40515035 matlab进阶摸索篇——彩色图直方图均衡化 - Rachel Zhang的专栏 - CSDN博客 http://blog.csdn.net/abcjennifer/article/details/6667504 用matlab_实现基于直方图均衡化的彩色图像增强 - 成人教育 - 道客巴巴 h

图像直方图均衡化

1. 直方图均衡化介绍 自我感觉书上讲的很清楚,直接把截图贴上了. 在进行直方图均值化的过程如下 读入图像对每个通道分别统计像素值[0,255]出现的次数.对每个通道分别求像素值[0,255]出现的概率,得到概率直方图.对每个通道分别求像素值[0,255]概率的前缀和,得到累计直方图.对每个通道根据累计直方图分别求像素映射函数.对每个通道完成每个像素点的映射.输出直方图均衡化的图像.2.代码(MATLAB) 1 %直方图均衡化 2 I = imread('D:/picture/girl.jpg'