自动色阶
第一步,分别统计各通道(红/绿/蓝)的直方图。
第二步,分别计算各通道按照给定的参数所确定的上下限值。什么意思呢,比如对于蓝色通道,我们从色阶0开始向上累加统计直方图,当累加值大于LowCut所有像素数时,以此时的色阶值计为BMin。然后从色阶255开始向下累计直方图,如果累加值大于HighCut所有像素时,以此时的色阶值计为BMax。
第三步,按照我们刚刚计算出的MinBlue/MaxBlue构建一个隐射表,隐射表的规则是,对于小于MinBlue的值,则隐射为0(实际上这句话也不对,隐射为多少是和那个自动颜色校正选项对话框中的阴影所设定的颜色有关,默认情况下是黑色,对应的RGB分量都为0,所以我们这里就隐射为0,有兴趣你们也可以指定为其他的参数),对于大于MaxBlue的值,则隐射为255(同理,这个值和高光的颜色设置有关),对于介于MinBlue和MaxBlue之间的值,则进行线性隐射,默认是隐射为0到255之间(当然实际是和我们的暗调和高光的设置有关,并且这里其实也不是线性隐射,是有一个Gamma校正,为了简便,用线性替代效果也没太大的问题)。
最后一步,对各通道图像数据进行隐射。
// AutoLevel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>
#include<vector>
#include <algorithm>
using namespace cv;
void AutoLevelsAdjust(cv::Mat& src, cv::Mat& dst)
{
CV_Assert(!src.empty() && src.channels() == 3);
//统计灰度直方图
int BHist[256] = {
0 }; //B分离
int GHist[256] = {
0 }; //G分量
int RHist[256] = {
0 }; //R分量
cv::MatIterator_<Vec3b> its, ends;
for (its = src.begin<Vec3b>(), ends = src.end<Vec3b>(); its != ends; its++)
{
BHist[(*its)[0]]++;
GHist[(*its)[