导航:首页 > 源码编译 > 灰度直方图算法

灰度直方图算法

发布时间:2023-09-12 08:49:06

A. OpenCV C++(四)----对比度增强

对比度增强或者称为对比度拉伸就是图像增强技术的一种,它主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来更加清晰。对比 度增强有几种常用的方法,如线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化等。

灰度直方图是图像灰度级的函数, 用来描述每个灰度级在图像矩阵中的像素个数或者占有率(概率)。

OpenCV提供了函数 calcHist 来实现直方图的构建,但是在计算8位图的灰度直方图 时,它使用起来略显复杂。下面是OpenCV源码

可以定义函数 calcGrayHist 来计算灰度直方图,其中输入参数为8位图,将返回的灰度直方图存储为一个1行256列的 Mat 类型。

图像对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之,对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰,所以通过算法调整图像的灰度值,从而调整图像的对比度是有必要的。最简单的一种对比度增强方法是通过灰度值的线性变换来实现的。

当a=1,b=0时,O为I的一个副本;如果a>1,则输出图像O的对 比度比I 有所增大;如果0<a< 1,则O的对比度比I有所减小。而b值的改变,影响的是输出图像的亮度,当b> 0时,亮度增加;当b<0时,亮度减小。

在OpenCV中实现一个常数与矩阵相乘有多种方式。
1、convertTo

注:当输出矩阵的数据类型是 CV_8U 时, 大于255的值会自动截断为255

2、矩阵乘法运算

使用乘法运算符“*”, 无论常数是什么数据类型, 输出矩阵的数据类型总是和输入矩阵的数据类型相同,当数据类型是 CV_8U 时,在返回值中将大于255的值自动截断为255。

3、convertScaleAbs

直方图正规化是一种自动选取a和b的值的线性变换方法。

利用 minMaxLoc 函数不仅可以计算出矩阵中的最大值和最小值, 而且可以求出最大 值的位置和最小值的位置。 当然,
在使用过程中如果只想得到最大值和最小值, 则将其 他的变量值设为 NULL 即可。

OpenCV提供的函数: normalize()
使用函数 normalize 对图像进行对比度增强时, 经常令参数 norm_type=NORM_MINMAX , 和直方图正规化原理详解中提到的计算方法是相同的, 参数 alpha 相当于 Omax , 参数 beta 相当于 Omin 。 注意, 使用 normalize 可以处理多通道矩阵, 分别对每一个通道进行正规化操作。

非线性变换

假设输入图像为I,宽为W、 高为H,首先将其灰度值归一化到[0,1]范围,对于8位 图来说,除以255即可。 I (r, c) 代表归一化后的第r行第c列的灰度值, 输出图像记为 O, 伽马变换就是令 O(r, c) =I(r, c) γ , 0≤r<H, 0≤c< W,

当γ=1时, 图像不变。 如果图像整体或者感兴趣区域较暗, 则令0< γ< 1可以 增加图像对比度; 相反, 如果图像整体或者感兴趣区域较亮, 则令γ>1可以降低图像对比度。

伽马变换在提升对比度上有比较好的效果, 但是需要手动调节γ值。

全局直方图均衡化操作是对图像I进行改变, 使得输出图像O的灰度直方图 hist O 是“平”的, 即每一个灰度级的像素点个数是“相等”的。 注意,其实这里的“相等”不是严格意义上的等于, 而是约等于,

上述分别为I和O的累加直方图

总结,对于直方图均衡化的实现主要分四个步骤:

OpenCV实现的直方图均衡化函数 equalize-Hist , 其使用方法很简单, 只支持对 8位图 的处理。

虽然全局直方图均衡化方法对提高对比度很有效,但是均衡化处理以后暗区域的噪声可能会被放大,变得清晰可 见,而亮区域可能会损失信息。为了解决该问题, 提出了自适应直方图均衡化(Aptive Histogram Equalization) 方法。

自适应直方图均衡化首先将图像划分为不重叠的区域块(tiles) ,然后对每一个块分别进行直方图均衡化。 显然, 在没有噪声影响的情况下, 每一个小区域的灰度直方图会被限制在一个小的灰度级范围内; 但是如果有噪声, 每一个分割的区域块执行直方图均衡化后, 噪声会被放大。为了避免出现噪声这种情况, 提出了“限制对比度”(Contrast Limiting) [3],如果直方图的bin超过了提前预设好的“限制对比度”, 那么会被裁减, 然 后将裁剪的部分均匀分布到其他的bin, 这样就重构了直方图。

OpenCV提供的函数 createCLAHE 构建指向 CLAHE 对象的指针, 其中默认设置“限制 对比度”为40,块的大小为8×8。

B. GMM模型是什么

就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。GMMs已经在数值逼近、语音识别、图像分类、图像去噪、图像重构、故障诊断、视频分析、邮件过滤、密度估计、目标识别与跟踪等领域取得了良好的效果。

对图像背景建立高斯模型的原理及过程:图像灰度直方图反映的是图像中某个灰度值出现的频次,也可以认为是图像灰度概率密度的估计。如果图像所包含的目标区域和背景区域相比比较大,且背景区域和目标区域在灰度上有一定的差异,那么该图像的灰度直方图呈现双峰-谷形状。

主要步骤

1、为图像的每个像素点指定一个初始的均值、标准差以及权重。

2、收集N(一般取200以上,否则很难得到像样的结果)帧图像利用在线EM算法得到每个像素点的均值、标准差以及权重)。

3、从N+1帧开始检测,检测的方法:

对每个像素点:

1)将所有的高斯核按照ω/σ降序排序

2)选择满足公式的前M个高斯核:M= arg min(ω/σ>T)

3)如果当前像素点的像素值在中有一个满足:就可以认为其为背景点。

C. 直方图均衡化对有些图片不能达到好的效果, 为什么

我来说一下

首先直方图均衡化的公式为sk对nj/n在j由0到k求和,正如楼主你所说,它所起到的作用是把原本分布不均的灰度直方图在整个灰度级别内均匀分布。

呵呵,一定要抓住这一点,即均衡化是由公式实现的,你想一想,对于一幅很暗的图片,既是它的灰度直方图全都集中在低灰度区,即比如灰度值由0-255,灰度值是2,3,5等的低灰度的频数就会很大,即它们的频率好高,因为这幅画很暗。好,现在咱们把这幅画均衡化,看那个公式的定义,根据公式得来的数据,即均衡化后的直方图中,低灰度区,比如5这一灰度级所对应的频数是不是很大,因为现在的是把原图中低灰度区,即正如上面所假设的2,3,5这些频率很大的灰度级相加而得,当然加后所得更大,即在均衡化后,仅5这一点得频数就已经很高,即频数很大,即灰度级很大,可想而知,越往后加,灰度级都很大,对应的,灰度级大了,当然直方图就集中在高灰度区,相应的图像就发白或很亮。特别亮的也是一个道理。

对于这种情况,应该用直方图规定化(匹配)来处理。

对于马赛克,很简单,你想想,先画一个8*8格,拿不同深度的铅笔,比如H,2H,B,2B之类的,你想在只拿一种深度的把四个格都涂满,是不是黑乎乎一片,然后拿两种笔涂,是不是有了区别。你用的铅笔深度种类越多,整个格所构成的图画细节越明显。同理,当你把很暗的图均衡化后,灰度级别都集中在高灰度区,就相当于笔的种类很少来画这幅画,当然也有马赛克。

给你截的图是均衡化后的,你仔细想想.

呵呵

D. photoshop 怎么实现直方图均衡化

图形处理中有一种对比度变换,像显示器就有对比度调节,PhotoShop也有图片的对比度修改,对比度的提高可以使图像细节清晰,相反,对比度的减小可以隐藏图像的细节,在一定程度上使图像柔和。

对比度变换其中一种比较简单的方法是直方图均衡化。
所谓直方图就是在某一灰度级的象素个数占整幅图像的象素比 h=nj/N,其中nj是灰度级在j的象素数,N是总象素数,扫描整幅图像得出的h的离散序列就是图像的直方图,h求和必然=1,所以直方图可以看成是象素对于灰度的概率分布函数。

直方图是高低不齐的,因为象素灰度是随机变化的,直方图均衡化就是用一定的算法使直方图大致平和。

算法如下:
对于一个直方图
设 Pr(r)是原始图像直方图,Ps(s)是均衡化的直方图,
由于其是一个概率分布函数
所以有 Ps(s)ds=Pr(r)dr (编辑关系,ds,dr是积分变量)
因为要进行均衡化,令 Ps(s)=1,
得 ds=Pr(r)dr/1
两边积分得 s=F Pr(r)dr (因为编辑关系,左边F表示积分符号....-__-++)
数字图像是离散的,因此离散化上式得
sk=E{j=0,k}(nj/N) 左式k,j是离散量下标,因为编辑关系,E{0,k}表示下标0到k的连加符号,N是象素总数
由此得出每一象素的sk为均衡化后的正规化灰度(即灰度正规化到[0,1]),统计sk即可得出均衡化后的直方图。
在均衡化过程中可以对每一象素映射到新的实际灰度值sk*255,就实现了图像的变换
(严格理论中应该是灰度正规化到[0,1]区间,然后均衡化后的sk还要量化到原始的正规灰度以实现灰度合并,下面的BCB程序并没有量化,而且255是固定灰度级,因为256色BMP的彩色表就是256个表项)

现在开始实践
用BCB对一BMP灰度图像进行直方图均衡化处理,代码如下
//----------------------------BCB6代码

#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include "Unit1.h"
#include"File1.h"

#pragma pack(1)

//BMP文件头
struct BITMAPFILEHEADER_
{
short type;
int bfSize;
short re1,re2;
int Offbits;
};
//BMP信息头
struct BITMAPINFO_
{
long size;
long width,height;
short planes,bitCount;
long comp,sizeImg;
long xpels,ypels;
long used,important;
};
//BMP彩色表项
struct COLOR_
{
char blue,green,red,re;
};
//------将BMP彩色表的数据校正到BCB TColor的数据。
void SwitchColor(long &c)
{
long blue=c& 0x000000ff;
long green=c& 0x0000ff00;
long red=c& 0x00ff0000;
c=(blue<<16) | green | (red>>16);
}

void xxx()
{
FILE *f=fopen("f:\\bbs_prev2.bmp","rb");
if(f==NULL) /*判断文件是否打开成功*/
{
ShowMessage("File open error");
return;
}

fseek(f,0,0);//移动到开头

//----------读BMP文件头
BITMAPFILEHEADER_ *bmph=new BITMAPFILEHEADER_();
if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1,f)==NULL)
{
ShowMessage("File read error");
return;
}

//-----------读BMP信息头
BITMAPINFO_ *bmpi=new BITMAPINFO_();
if(fread((char*)bmpi,sizeof(BITMAPINFO_),1,f)==NULL)
{
ShowMessage("File read error2");
return;
}

//--------------读彩色表
long *c=new long[bmph->Offbits-sizeof(BITMAPFILEHEADER_)-sizeof(BITMAPINFO_)];
fread((char*)c,bmph->Offbits-sizeof(BITMAPFILEHEADER_)-sizeof(BITMAPINFO_),1,f);

//----------显示一些信息
Form1->Edit1->Text=IntToStr(bmph->bfSize);
Form1->Edit2->Text=IntToStr(bmpi->width);
Form1->Edit3->Text=IntToStr(bmpi->height);
Form1->Edit4->Text=IntToStr(bmpi->comp);
Form1->Edit5->Text=IntToStr(bmpi->used);

int i,j,k,wc;
long N=bmph->bfSize- bmph->Offbits;//象素总数
unsigned char *image=new char[N]; //位图矩阵
unsigned char *newimage=new char[N];//变换后的位图矩阵

fread(image,N,1,f);//读入位图矩阵

//---------直方图数列初始化
//---------直方图数列用来存储正规化后的灰度
double *h=new double[255];//255个灰度级,保存原始图像正规化灰度直方图数据
for(i=0;i<255;i++)
h[i]=0.0;
double *nh=new double[255];//255个灰度级,保存变换后的图像正规化灰度直方图
for(i=0;i<255;i++)
nh[i]=0.0;

long *count=new long[255]; //每一灰度级的象素数量统计
for(i=0;i<255;i++)
count[i]=0;
for(i=0;i<N;i++)
{
count[image[i]]++;
}
//-----正规化灰度概率统计
for(i=0;i<255;i++)
{
h[i]=count[i]/(double)N;
}
//------正规化新灰度图
double hc;
for(i=0;i<N;i++)
{
hc=0;
for(j=0;j<image[i];j++)
hc+=h[j];
nh[image[i]]+=hc; //保存新正规化灰度图
newimage[i]=hc*255; //保存新图像灰度索引
}
//----------显示直方图
for(i=0;i<255;i++)
{
//原始直方图
Form1->Canvas->MoveTo(10+i,200);
Form1->Canvas->LineTo(10+i,200+h[i]*N);
//新直方图
Form1->Canvas->MoveTo(300+i,200);
Form1->Canvas->LineTo(300+i,200+nh[i]*255);
}
//------显示图形
TColor *tc;
if(bmpi->width%4==0)//-----------因为BMP图像4字节对齐
wc=bmpi->width/4*4;
else
wc=(bmpi->width/4+1)*4;

long a;
long pos=0;
for( i=0;i<bmpi->height;i++)
{
for(j=0;j<wc;j++)
{
//-----原始图形
a= c[image[pos]];
SwitchColor(a);
Form1->Canvas->Pixels[10+j][600-i]=a;
//------新图形
a= c[newimage[pos]];
SwitchColor(a);
Form1->Canvas->Pixels[300+j][600-i]=a;
pos++;
}
}
fclose(f);
}

这个程序使用256色BMP文件,但程序代码是针对灰度图像的,用于彩色图像时得出一些古怪色彩配合而已。

在对灰度图像均衡化时
如果原始图像对比度本来就很高,如果再均衡化则灰度调和,对比度降低。
在泛白缓和的图像中,由于均衡化过程中会合并一些象素灰度,则会增大对比度,这里255灰度级太多,合并不明显。
http://hi..com/j_fo/blog/item/09a6adc3f8078855b319a8ac.html
还有详细的说明和图解

E. 直方图均衡化处理的主要步骤是什么

设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。

在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f)。

这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):

(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。

(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致性。

(5)灰度直方图算法扩展阅读:

直方图均衡化作用

这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。

这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。

这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。

在统计学中,直方图(英语:Histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。直方图是品质管理七大工具之一。

把直方图上每个属性的计数除以所有属性的计数之和,就得到了归一化直方图。之所以叫“归一”,是因为归一化直方图的所有属性的计数之和为1,也就是说,每个属性对应计数都是0到1之间的一个数(百分比)。

参考资料来源:网络-直方图均衡化

F. 灰度值是什么是怎么测量的

灰度值是指将灰度对象转换为 RGB 时,每个对象的颜色值。把白色与黑色之间按对数关系分成若干级,称为“灰度等级”,使用黑白或灰度扫描仪测量生成的图像通常以灰度显示。

在计算机领域中,灰度(Gray scale)数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。

灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。

在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。灰度使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。

每个灰度对象都具有从 0%(白色)到100%(黑色)的亮度值。 使用黑白或灰度扫描仪生成的图像通常以灰度显示。



(6)灰度直方图算法扩展阅读



灰度等级范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像,在医学、图像识别领域有很广泛的用途。

灰度分布是指灰度图像的灰度值的分布情况,反映了图像的最基本的统计特征。灰度分布主要应用于图像分割中,通过对灰度图像的灰度分布的理解,来分析图像一些性质。

灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。

如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用probability density function (PDF)来刻画和描述,表现为灰度直方图。可以通过直方图的状态来评断图像的一些性质,明亮图像的直方图倾向于灰度级高的一侧;

低对比度图像的直方图窄而集中于灰度级的中部,高对比度图像的直方图成分覆盖的灰度级很宽而且像素的分布没有不太均匀,只有少量的垂线比其他高许多。

直观上来说:若一幅图像其像素占有全部可能的灰度级并且分布均匀,则这样的图像有高对比度和多变的灰度色调。

从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应于概率密度函数(probabilitydensityfunction),而概率分布函数就是直方图的累积和,即概率密度函数的积分。

阅读全文

与灰度直方图算法相关的资料

热点内容
如何建立主索引命令 浏览:599
mac电脑怎么打开终端命令 浏览:741
androidvpn待机不断 浏览:756
硬盘的文件夹如何设置密码 浏览:384
plc定位编程 浏览:47
mac命令添加用户 浏览:815
android时间widget 浏览:393
qd128h压缩机参数 浏览:287
用单片机测车距 浏览:394
去哪里找加密的便签 浏览:19
武汉订酒店旅馆哪个app平台好 浏览:114
c语言在线编译器字节流 浏览:317
带队伍pdf 浏览:951
电脑如何形成服务器 浏览:522
javaprint换行 浏览:785
华为手机压缩文件夹怎么操作 浏览:99
c语言垃圾堆这个文件夹可以删吗 浏览:758
websocketssl加密 浏览:924
系统类算法 浏览:657
ai算法血检t细胞衰老 浏览:473