java怎么实现直方图均衡化_直方图均衡化原理与实现
直方图均衡化(Histogram Equalization)又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。
直方图是表示数字图像中每一灰度出现频率的统计关系。直方图能给出图像灰度范围、每个灰度的频度和灰度的分布、整幅图像的平均明暗和对比度等概貌性描述。灰度直方图是灰度级的函数,反映的是图像中具有该灰度级像素的个数,其横坐标是灰度级r,纵坐标是该灰度级出现的频率(即像素的个数) pr( r) ,整个坐标系描述的是图像灰度级的分布情况,由此可以看出图像的灰度分布特性,即若大部分像素集中在低灰度区域,图像呈现暗的特性;若像素集中在高灰度区域,图像呈现亮的特性。
图1所示就是直方图均衡化,即将随机分布的图像直方图修改成均匀分布的直方图。基本思想是对原始图像的像素灰度做某种映射变换,使变换后图像灰
度的概率密度呈均匀分布。这就意味着图像灰度的动态范围得到了增加,提高了图像的对比度。
图1直方图均衡化
通过这种技术可以清晰地在直方图上看到图像亮度的分布情况,并可按照需要对图像亮度调整。另外,这种方法是可逆的,如果已知均衡化函数,就可以恢复原始直方图。
设变量r代表图像中像素灰度级。对灰度级进行归一化处理,则0≤r≤1,其中r= 0表示黑, r= 1表示白。对于一幅给定的图像来说,每个像素值在[ 0,1]的灰度级是随机的。用概率密度函数来表示图像灰度级的分布。
为了有利于数字图像处理,引入离散形式。在离散形式下,用代表离散灰度级,用代表,并且下式成立:
其中, 0≤≤1, k=0, 1, 2,…, n-1。式中为图像中出现这种灰度的像素数, n是图像中的像素总数,而就是概率论中的频数。图像进行直方图均衡化的函数表达式为:
式中, k为灰度级数。相应的反变换为:
四、算法实现及结果分析
4.1核心算法
#define HDIM 256
#define SRC 0
#define DST 1
int main(int argc, char** argv)
{
IplImage *src = 0, *dst = 0;
int n[] = {HDIM,HDIM,HDIM};
int r[256] = {0}, g[256] = {0}, b[256] = {0};
if(argc!=2 || (src = cvLoadImage(argv[1],3))== NULL) return -1;
cvNamedWindow("source",1);
cvNamedWindow("result",1);
int width = src->width;
int height = src->height;
int sum = width * height; //图像中的像素点综合
int i,j;
//分别统计直方图的RGB分布
for(i=0; i
for(j=0; j
{
b[((uchar*)(src->imageData+i*src->width))[j*src->nChannels+0]]++;
g[((uchar*)(src->imageData+i*src->width))[j*src->nChannels+1]]++;
r[((uchar*)(src->imageData+i*src->width))[j*src->nChannels+2]]++;
}
构建直方图的累计分布方程,用于对直方图进行均衡化
double val[3] = {0};
for(i=0; i
{
val[0] += b[i];
val[1] += g[i];
val[2] += r[i];
b[i] = val[0]*255/sum;
g[i] = val[1]*255/sum;
r[i] = val[2]*255/sum;
}
dst = cvCreateImage(cvSize(width,height),8,3);
//归一化直方图
for(i=0; i
for(j=0; j
{
((uchar*)(dst->imageData+i*dst->widthStep))[j*dst->nChannels+0]=b[((uchar*)(src->imageData+i*src->widthStep))[j*src->nChannels+0]];
((uchar*)(dst->imageData+i*dst->widthStep))[j*dst->nChannels+1]=g[((uchar*)(src->imageData+i*src->widthStep))[j*src->nChannels+1]];
((uchar*)(dst->imageData+i*dst->widthStep))[j*dst->nChannels+2]=r[((uchar*)(src->imageData+i*src->widthStep))[j*src->nChannels+2]];
}
cvShowImage("source",src);
cvShowImage("result",dst);
cvSaveImage("out.jpg",dst);
cvWaitKey(0);
cvDestroyWindow("source");
cvDestroyWindow("result");
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseHist(&hist);
return 0;
}
4.2结果展示
对于第一幅图像,首先我们在RGB空间对其进行直方图均衡化得如下结果:
可见右上角由较大的光影,我们对其进行同台滤波,如下图所示,但是效果也不太好。
如下图所示为直方图均衡前后图像RGB分量的直方图,可以看到收到了较好的效果,由于直方图均衡第二个作业已经做过,我们在此不再赘述。
对于HSI空间的直方图均衡化,首先我们要进行RGB和HIS空间颜色分量的转化,代码如下:
/**************************************************************
函数功能:对图像进行由RGB空间到HSI空间的转化
输入参数:源图像src;目标图像des;图像参数width,height,nChannels;
输出参数:目标图像
**************************************************************/
void rgb_hsi(unsigned char* des, const unsigned char* src, int width, int height, int nChannels)
{
for(int y=0; y
{
for (int x=0; x
{
double B= src[y * width * nChannels + x * nChannels ] ;
double G= src[y * width * nChannels + x * nChannels + 1] ;
double R= src[y * width * nChannels + x * nChannels + 2] ;
double H,S,I=0;//H色调、S饱和度(纯度)、I强度
double mx,mi;
mx=max(max(R,G),B);
mi=min(min(R,G),B);
if (mx==mi) //如果RGB相等
{
k=k+1;
H=0; //H分量为0
S=0; //S分量为0
I=mi;
}
else
{
if (B<=G)
{
H=acos((0.5*((R-B)+(R-G)))/(sqrt(1.0*((R-G)*(R-G)+(R-B)*(G-B)))));
}
else
{
H=360-acos((0.5*((R-B)+(R-G)))/(sqrt(1.0*((R-G)*(R-G)+(R-B)*(G-B)))));
}
S=(3*mi)/(R+B+G);
S=1-S;
I=(R+B+G)/3;
}
des[y * width * nChannels + x * nChannels + 0]= int(H);
des[y * width * nChannels + x * nChannels + 1]= int (S*255);
des[y * width * nChannels + x * nChannels + 2]=int(I);
}
}
}
/**************************************************************
函数功能:对图像进行由HSI空间到RGB空间的转化
输入参数:源图像src;目标图像des;图像参数width,height,nChannels;
输出参数:目标图像
**************************************************************/
void hsi_rgb(unsigned char* des, const unsigned char* src, int width, int height, int nChannels)
{
for(int y=0; y
{
for (int x=0; x
{
double H= src[y * width * nChannels + x * nChannels ] ;
//printf("H%d",H);
double S= src[y * width * nChannels + x * nChannels + 1]/255 ;
//printf("S%d",S);
double I= src[y * width * nChannels + x * nChannels + 2] ;
//printf("I%d",I);
double R,G,B;//H色调、S饱和度(纯度)、I强度
if((H>=0)&&(H<120))
{
B=I*(1-S);
R=I*(1+S*cos(H)/cos(60-H));
G=3*I-(R+B);
}
else if((H>=120)&&(H<240))
{
H=H-120;
R=I*(1-S);
G=I*(1+S*cos(H)/cos(60-H));
B=3*I-(R+G);
}
else
{
H=H-240;
G=I*(1-S);
B=I*(1+S*cos(H)/cos(60-H));
R=3*I-(B+G);
}
des[y * width * nChannels + x * nChannels + 0]= int(B);
des[y * width * nChannels + x * nChannels + 1]= int(G);
des[y * width * nChannels + x * nChannels + 2]= int(R);
for(int n=0;n
{
int val=des[y * width * nChannels + x * nChannels + n];
if(val<0)
des[y * width * nChannels + x * nChannels + n]=0;
else if(val>255)
des[y * width * nChannels + x * nChannels + n]=255;
else
des[y * width * nChannels + x * nChannels + n]=des[y * width * nChannels + x * nChannels + n];
}
}
}
}
但是效果并不是很好,结果如下图所示,可见变换后的图像虽然比以前增强了,但是几乎变成了灰度图像。
java怎么实现直方图均衡化_直方图均衡化原理与实现相关推荐
- 不调用python函数实现直方图均衡化_直方图均衡化(HE)
前面我们已经讲过图像的直方图,那图像的直方图均衡化又是干嘛的呢? 顾名思义:其实对直方图进行均衡化,哈哈感觉自己说的就是废话... 举个例子: import cv2 from matplotlib i ...
- python批量直方图均衡化_直方图均衡化-Python实现
需要均衡的图像 将下面的图像进行直方图均衡 1 3 9 9 8 2 1 3 7 3 3 6 0 6 4 6 8 2 0 5 2 9 2 6 0 均衡化计算过程 使用python进行直方图均衡化: # ...
- java asm源码分析_探究CAS原理(基于JAVA8源码分析)
比较并替换,实现并发算法时常用到的一种技术,在java同步器中大量使用了CAS技术,神奇的实现了多线程执行的安全性 思想很简单:三个参数一个当前内存值V 旧的预期值A 即将更新的值B 当且仅当预期值A ...
- java 灰度直方图_【数字图像处理】灰度直方图、直方图均衡化、直方图规定化...
灰度直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少. 图像的灰度直方图是灰 ...
- 直方图均衡化取整怎么计算_玩转直方图处理之直方图均衡化、规定化
冒泡....双十一刚过~购物狂欢完还是要收心学习鸭!今天来说一说直方图. 直方图 定义: 直方图是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况. 一般用横轴表示数据类型,纵轴表示 ...
- opencv曝光过度_直方图均衡化
直方图均衡化 想象一下,如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高.但是一副高质量的图像的像素值分布应该很广泛.所以 ...
- c++ opencv 图像处理:直方图处理(直方图均衡化,直方图匹配(规定化))
文章目录 前言 一.直方图(histogram) 二.直方图处理 1.直方图均衡化 2.直方图匹配(规定化) 三.opencv函数总结 1.equalizeHist图像均衡化 2.calcHist获取 ...
- OpenCV(十九)直方图(直方图计算、掩膜、均衡化、自适应均衡化)
目录 一.基础理论 1.原理及作用 2.专业术语 二.直方图计算 函数介绍: 1.灰度图 代码: 效果: 2.彩色图 代码: 三.直方图掩膜的应用(mask) 1.基础理论 2.代码 3.效果 四.直 ...
- 【OpenCV 】直方图均衡化,直方图计算,直方图对比
目录 1.直方图均衡化¶ 1.1 原理 1.2 直方图均衡化 1.3 直方图均衡化原理 1.4 代码实例 1.5 运行效果 2. 直方图计算¶ 2.1 目标 2.2 直方图 2.3 代码实例 2.4 ...
- opencv进阶学习笔记7:直方图,直方图均衡化,直方图比较,直方图反向投影
基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 直方图基础讲解: opencv学 ...
最新文章
- PyCharm为什么这么牛?
- 如何看待2016年安防市场?
- 【Leetcode】14、Longest Common Prefix
- python 使用raise语句主动抛出异常(Exception)、将异常抛出给上一级
- 法国标致雪铁龙汽车公司采用通快碟片激光器进行焊接
- C# GridView单元格合并.
- AI又破案!衢州城市大脑这回抓了一个抢劫犯
- c语言归并排序数组不固定,归并排序非递归实现C语言
- WDS系列之四:自定义安装映像
- 【CCCC】L2-009 抢红包 (25分),,间接排序,比较double大小
- 方维出现 Fatal error: Class 'Session' not found
- C语言 二级指针内存模型②
- python课题_python课题报告
- 动态贝叶斯网络DBN
- MATLAB画柱状图对比
- 利用dem生成横断面数据
- 某计算机配置的内存为2GB,实测告诉你为APU分配64MB和2GB显存性能差距多大
- excel打印预览分页_Excel分页符预览技巧
- 油猴插件安装以及好用的脚本推荐
- WIN10系统如何彻底关闭防火墙