在http://www.cnblogs.com/Imageshop/archive/2011/11/13/2247614.html 一文中,作者给出了“自动对比度”的实现方法,非常nice

实际实现过程中,我发现文中有 “Dim HistRed(255)”这样的定义。一般来说,通道是0-255一个256阶的吧,如果不是语法的不同,应该是一个bug.

另附上opencv的实现代码,dirty code,欢迎有人优化!

Mat autocontrost(Mat matface)
{
//进行自动对比度校正
double HistRed[]={};
double HistGreen[]={};
double HistBlue[]={};
int bluemap[]={};
int redmap[]={};
int greenmap[]={}; double dlowcut = 0.1;
double dhighcut = 0.1;
for (int i=;i<matface.rows;i++)
{
for (int j=;j<matface.cols;j++)
{
int iblue =matface.at<Vec3b>(i,j)[];
int igreen=matface.at<Vec3b>(i,j)[];
int ired =matface.at<Vec3b>(i,j)[];
HistBlue[iblue]++;
HistGreen[igreen]++;
HistRed[ired]++;
}
}
int PixelAmount = matface.rows*matface.cols;
int isum = ;
// blue
int iminblue=;int imaxblue=;
for (int y = ;y<;y++)//这两个操作我基本能够了解了
{
isum= isum+HistBlue[y];
if (isum>=PixelAmount*dlowcut*0.01)
{
iminblue = y;
break;
}
}
isum = ;
for (int y=;y>=;y--)
{
isum=isum+HistBlue[y];
if (isum>=PixelAmount*dhighcut*0.01)
{
imaxblue=y;
break;
}
}
//red
isum=;
int iminred=;int imaxred=;
for (int y = ;y<;y++)//这两个操作我基本能够了解了
{
isum= isum+HistRed[y];
if (isum>=PixelAmount*dlowcut*0.01)
{
iminred = y;
break;
}
}
isum = ;
for (int y=;y>=;y--)
{
isum=isum+HistRed[y];
if (isum>=PixelAmount*dhighcut*0.01)
{
imaxred=y;
break;
}
}
//green
isum=;
int imingreen=;int imaxgreen=;
for (int y = ;y<;y++)//这两个操作我基本能够了解了
{
isum= isum+HistGreen[y];
if (isum>=PixelAmount*dlowcut*0.01)
{
imingreen = y;
break;
}
}
isum = ;
for (int y=;y>=;y--)
{
isum=isum+HistGreen[y];
if (isum>=PixelAmount*dhighcut*0.01)
{
imaxgreen=y;
break;
}
}
/////////自动色阶
//自动对比度
int imin = ;int imax =;
if (imin>iminblue)
imin = iminblue;
if (imin>iminred)
imin = iminred;
if (imin>imingreen)
imin = imingreen;
iminblue = imin ;
imingreen=imin;
iminred = imin ;
if (imax<imaxblue)
imax = imaxblue;
if (imax<imaxgreen)
imax =imaxgreen;
if (imax<imaxred)
imax =imaxred;
imaxred = imax;
imaxgreen = imax;
imaxblue=imax;
/////////////////
//blue
for (int y=;y<;y++)
{
if (y<=iminblue)
{
bluemap[y]=;
}
else
{
if (y>imaxblue)
{
bluemap[y]=;
}
else
{
// BlueMap(Y) = (Y - MinBlue) / (MaxBlue - MinBlue) * 255 '线性隐射
float ftmp = (float)(y-iminblue)/(imaxblue-iminblue);
bluemap[y]=(int)(ftmp*);
}
} }
//red
for (int y=;y<;y++)
{
if (y<=iminred)
{
redmap[y]=;
}
else
{
if (y>imaxred)
{
redmap[y]=;
}
else
{
// BlueMap(Y) = (Y - MinBlue) / (MaxBlue - MinBlue) * 255 '线性隐射
float ftmp = (float)(y-iminred)/(imaxred-iminred);
redmap[y]=(int)(ftmp*);
}
} }
//green
for (int y=;y<;y++)
{
if (y<=imingreen)
{
greenmap[y]=;
}
else
{
if (y>imaxgreen)
{
greenmap[y]=;
}
else
{
// BlueMap(Y) = (Y - MinBlue) / (MaxBlue - MinBlue) * 255 '线性隐射
float ftmp = (float)(y-imingreen)/(imaxgreen-imingreen);
greenmap[y]=(int)(ftmp*);
}
} }
//查表
for (int i=;i<matface.rows;i++)
{
for (int j=;j<matface.cols;j++)
{
matface.at<Vec3b>(i,j)[]=bluemap[matface.at<Vec3b>(i,j)[]];
matface.at<Vec3b>(i,j)[]=greenmap[matface.at<Vec3b>(i,j)[]];
matface.at<Vec3b>(i,j)[]=redmap[matface.at<Vec3b>(i,j)[]];
}
}
return matface;
}

自动对比度的opencv实现的更多相关文章

  1. opencv在图像显示中文

    在图像定位和模式识别时,经常需要把结果标注到图片上,标注内容可以是数字字母.矩形框等(opencv支持的)或者是中文汉字(借助freetype). 1.显示数字/矩形框 #include <op ...

  2. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  3. opencv源码:cascadedetect

    级联分类器检测类CascadeClassifier,提供了两个重要的方法: CascadeClassifier cascade_classifier; cascade_classifier.load( ...

  4. 基于OpenCV的车辆检测与追踪的实现

    最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大 ...

  5. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  6. OpenCV人脸识别LBPH算法源码分析

    1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...

  7. OpenCV模板匹配算法详解

    1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...

  8. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  9. 海康网络摄像机YV12转换为BGR,由opencv Mat显示 (转)

    我使用的是海康DS-2CD852MF-E, 200万,网络摄像机,已经比较老了,不过SDK在海康官网下载的,开发流程都差不多. 海康摄像机回调解码后的视频数据格式为YV12,顺便说一下YV12的数据格 ...

随机推荐

  1. CSV文件插入到mysql表中指定列

    参考资料: -CSV文件插入到mysql表中指定列

  2. 虚拟机窗口太小_安装VMware Tools(winxp)

    1.新安装完系统后窗口较小 2.在虚拟机->安装VMware Tools 3.如果像上图一样,“安装VMware Tools”是灰色的,那么在虚拟机设置中再添加一个CD/DVD驱动器 4.然后进 ...

  3. hash专题学习笔记QAQ

    开始说要我给hash写一个专题的时候我是拒绝的,,,我本来想着就把它放到那个考前续命里存个模板就好了 突然想起来之前好像是在蓝书上看到过关于hash的专题?也还有两三道题呢,而且这种思想还是很有意义的 ...

  4. 一个简单的servlet查询

    首先创建一个dynamic web project. 写一个test.jsp: 新建一个servlet: 新建一个student.jsp: 显示如图:

  5. mysql 数据操作 多表查询 子查询 带IN关键字的子查询

    1 带IN关键字的子查询 #查询平均年龄在25岁以上的部门名关键点部门名 以查询员工表的dep_id的结果 当作另外一条sql语句查询条件使用 in (sql语句) mysql ; +-------- ...

  6. 网络比总线差多了 除非是真正的mpp并行架构

    网络比总线差多了 除非是真正的mpp并行架构 楼方鑫HZproxy里内置一个memory db,可以解决跨库查询中最难的部份.楼方鑫HZ 2015/1/24 21:52:33@joe 用两层DB就好解 ...

  7. Python安装常见问题(1):zipimport.ZipImportError: can't decompress data

    在CentOS以及其他的Linux系统中遇到安装包安装错误的原因,大多数都是因为缺少依赖包导致的,所以对于错误:zipimport.ZipImportError: can’t decompress d ...

  8. Elasticsearch Date类型使用技巧

    elasticsearch原生支持date类型.这里简单记录下使用的方法. 使用date类型可以用如下两种方式: 使用毫秒的时间戳,直接将毫秒值传入即可. 传入格式化的字符串,默认是ISO 8601标 ...

  9. [LeetCode] 438. Find All Anagrams in a String_Easy

    438. Find All Anagrams in a String DescriptionHintsSubmissionsDiscussSolution   Pick One Given a str ...

  10. nltk模块基础操作

     几个基础函数 (1)搜索文本:text.concordance(word) 例如,在text1中搜索词”is”在文本中出现的次数以及上下文的词:text1.concordance("is& ...