【图像处理】直方图均衡化
来源:互联网 发布:mac死机如何强制重启 编辑:程序博客网 时间:2024/04/25 22:43
直方图均衡化原理
直方图均衡化的主要思想是直方图统计,在统计之后,根据具体的灰度值及其对应的出现概率,对图片的灰度进行拉伸,使得图像的对比度得到扩展,如下图这张经典的图像所示。
可以看到左上角的图像灰度比较集中,经过直方图均衡化之后,右下角的图像的灰度就被拉伸。
其原理是将图像中的灰度值根据其概率分布在0-255的区间。
转换后的灰度值为:
其中,sk是转变后的灰度值;
rk是输入的灰度值,
nj是灰度值为 j 的像素个数;
k是当前的灰度值,取值范围0到L-1(L通常为256)。
L表示灰度值可取的个数,如8bit的图像可以表示的灰度值有256,L=256.
举个例子
下图为具体图像的像素值,已知该图像的灰度值为0~7,现要求对其进行直方图均衡化。
这里我们可以得到下图所示的表,其中,L-1=7;Pr=像素个数/25;
根据转换后的灰度值,替换原先的像素值,图像变成:
PC端代码实现
根据以上原理,将其在PC端用程序实现如下:
<span style="font-size:14px;">bool getHist(unsigned char *pImgData, unsigned char *pHistData,int height,int width){ // 此处需要对输入的指针进行非空判断,此处略。int grayLvl[256]={0};float fP[256];int i;int sum = height*width; //计算总像素个数for(i=0 ; i < sum ;i++) //统计各个灰度值的像素点个数{grayLvl[pImgData[i]]++;}for(i=0; i < 256;i++) //计算每个灰度值的比重{fP[i]=(float)grayLvl[i]/(float)sum;}for(i=1; i < 256;i++) {fP[i]=fP[i-1]+fP[i];}for(i=0; i <m_ByteOfData;i++) //均衡化{<span style="white-space: pre;"></span>pHistData[i]=(unsigned char)(fP[pImgData[i]]*255.0+0.5);// 加上0.5是为了能够四舍五入取值。}return true;}</span><span style="font-size: 18px;"></span>
安卓平台移植
在安卓平台,图像处理的操作由JNI实现,基本与上面的程序一致。具体可参考《【安卓开发】JNI程序开发》
<span style="font-size:14px;">void Java_com_example_imageprocess_MainActivity_getHist(JNIEnv* env,jobject thiz,jbyteArray imgData, jbyteArray histData, jlong size){jint* graylvl=(jint*)malloc(256*sizeof(jint));jfloat* pb=(jfloat*)malloc(256*sizeof(jfloat));unsigned char* grayHist=(unsigned char*)malloc(256*sizeof(unsigned char));unsigned char *imgData_buf=(*env)->GetByteArrayElements(env,imgData,0); //获取jni数组unsigned char *histData_buf = (*env)->GetByteArrayElements(env,histData, NULL);int i;unsigned char index=0;memset(graylvl,0,256*sizeof(jint));for(i=0;i<size;i++){graylvl[imgData_buf[i]]++;}for(i=0;i<256;i++){pb[i]=(jfloat)graylvl[i]/(jfloat)size;}grayHist[0]=(unsigned char)(pb[0]*255.0+0.5);for(i=1;i<256;i++){pb[i]=pb[i-1]+pb[i];grayHist[i]=(unsigned char)(pb[i]*255.0+0.5);}for(i=0;i<size;i++){histData_buf[i]=grayHist[imgData_buf[i]];}//save the data from histData_buf to histData(*env)->SetByteArrayRegion(env,histData, 0, size,histData_buf);free(graylvl);free(pb);free(grayHist);}</span>
安卓代码优化
这里的优化是将浮点数优化成定点数,有一定的效果。
<span style="font-size:14px;"><span style="font-size:18px;">void Java_com_example_imageprocess_MainActivity_getHist(JNIEnv* env,jobject thiz,jbyteArray imgData, jbyteArray histData, jlong size){jint* graylvl=(jint*)malloc(256*sizeof(jint));jint* graylvlPtr=graylvl;unsigned int* pb=(unsigned int*)malloc(256*sizeof(unsigned int));unsigned int *pbPtr=pb;unsigned char* grayHist=(unsigned char*)malloc(256*sizeof(unsigned char));unsigned char *grayHistPtr=grayHist+1;unsigned char *imgData_buf=(*env)->GetByteArrayElements(env,imgData,0);unsigned char *imgPtr=imgData_buf;unsigned char *histData_buf = (*env)->GetByteArrayElements(env,histData, NULL);unsigned char *histPtr=histData_buf;int i;unsigned char index=0;unsigned int temp = (255<<20)/size;memset(graylvl,0,256*sizeof(jint));for(i=size;i!=0;i--){(*(graylvl+*imgPtr))++;imgPtr++;}for(i=256;i!=0;i--){*pbPtr=*graylvlPtr*temp;pbPtr++;graylvlPtr++;}grayHist[0]=(pb[0]>>20);pbPtr=pb+1;for(i=255;i!=0;i--){*pbPtr=*pbPtr+*(pbPtr-1);*grayHistPtr=(*pbPtr)>>20;pbPtr++;grayHistPtr++;}imgPtr=imgData_buf;for(i=size;i!=0;i--){*histPtr=*(grayHist+*imgPtr);imgPtr++;histPtr++;}//save the data from histData_buf to histData(*env)->SetByteArrayRegion(env,histData, 0, size,histData_buf);free(graylvl);free(pb);free(grayHist);}</span></span>
未优化的代码运行的时间为11ms,优化后代码运行时间为9ms。
处理的效果如下图所示,C1为未优化代码,C2为优化代码,发现C2运行后的结果存在一定误差,虽然误差较小(误差为1)。
0 0
- 图像处理------直方图均衡化
- 【图像处理】直方图均衡化
- 直方图均衡化---图像处理
- 【OpenCV3图像处理】图像直方图均衡化、直方图匹配
- 图像处理(二)直方图均衡化
- 图像处理之直方图均衡化
- 图像处理-光照规整-直方图均衡化
- 图像处理之(直方图)均衡化
- 直方图均衡化处理图像(python)
- 【VC图像处理】直方图均衡化
- 图像处理之直方图均衡化
- 图像处理之直方图均衡化
- 图像处理之直方图均衡化
- 图像处理(三):直方图均衡化
- 基于直方图均衡化的图像处理
- 图像处理opencv2-灰度直方图以及灰度直方图均衡化
- 灰度图像直方图均衡处理
- 彩色图像直方图均衡处理
- Android常见错误的解决
- bootstrap教程
- 选择排序(Java语言实现)
- chkconfig --add httpd Error服务不支持
- Java 注解处理器
- 【图像处理】直方图均衡化
- 顺序表的基本运算
- 悟~
- 实现动态修改flask的邮件配置
- 数据结构与算法分析:栈与队列
- [hdu 4803]Poor Warehouse Keeper 进制相关 贪心
- eclipse 通过文件附加jar包源码
- php验证码制作
- 数据结构