在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. 2018牛客网暑期ACM多校训练营(第四场) A - Ternary String - [欧拉降幂公式][扩展欧拉定理]

    题目链接:https://www.nowcoder.com/acm/contest/142/A 题目描述 A ternary string is a sequence of digits, where ...

  2. Lost connection to MySQL server during query ([Errno 104] Connection reset by peer)

    Can't connect to MySQL server Lost connection to MySQL server during query · Issue #269 · PyMySQL/Py ...

  3. SVN里直接把本地目录纳入管理

    如果本地有个已有的目录,要直接纳入SVN管理,怎么办呢?直接在Repository Browser里面 Add folder,但这样虽然把目录加到SVN,但本地目录没有纳入管理,你还要重新又下到本地才 ...

  4. Bone Collector--hdu2602(01背包)

    Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...

  5. IO流(4)重命名

    重命名功能:public boolean renameTo(File dest) * 如果路径名相同,就是改名. * 如果路径名不同,就是改名并剪切. * * 路径以盘符开始:绝对路径 c:\\a.t ...

  6. 【Python练习】文件引用用户名密码登录系统

    一.通过txt文件引入用户名密码 1 #coding=utf-8 from selenium import webdriver #from selenium.common.exceptions imp ...

  7. scrapy的post登录:renren

    # -*- coding: utf-8 -*- import scrapy class RenrenSpider(scrapy.Spider): name = 'renren' allowed_dom ...

  8. Linux中Readlink命令

    原文地址:http://blog.csdn.net/liangxiaozhang/article/details/7356829 readlink是Linux系统中一个常用工具,主要用来找出符号链接所 ...

  9. [LeetCode] 193. Valid Phone Numbers_Easy tag: Bash

    Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bas ...

  10. How to enable TLS 1.2 on Windows Server 2008 R2

    Problem How to enable TLS 1.2 on Windows Server 2008 R2? Resolution QuoVadis recommends enabling and ...