自动对比度的opencv实现

简介: 在http://www.cnblogs.com/Imageshop/archive/2011/11/13/2247614.html 一文中,作者给出了“自动对比度”的实现方法,非常nice 实际实现过程中,我发现文中有 “Dim HistRed(255)”这样的定义。

在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[256]={0};
    double HistGreen[256]={0};
    double HistBlue[256]={0};
    int bluemap[256]={0};
    int redmap[256]={0};
    int greenmap[256]={0};

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

    }
    //red
    for (int y=0;y<256;y++)
    {
        if (y<=iminred)
        {
            redmap[y]=0;
        }
        else 
        {
            if (y>imaxred)
            {
                redmap[y]=255;
            }
            else
            {
                //  BlueMap(Y) = (Y - MinBlue) / (MaxBlue - MinBlue) * 255      '线性隐射
                float ftmp = (float)(y-iminred)/(imaxred-iminred);
                redmap[y]=(int)(ftmp*255);
            }
        }

    }
    //green
    for (int y=0;y<256;y++)
    {
        if (y<=imingreen)
        {
            greenmap[y]=0;
        }
        else 
        {
            if (y>imaxgreen)
            {
                greenmap[y]=255;
            }
            else
            {
                //  BlueMap(Y) = (Y - MinBlue) / (MaxBlue - MinBlue) * 255      '线性隐射
                float ftmp = (float)(y-imingreen)/(imaxgreen-imingreen);
                greenmap[y]=(int)(ftmp*255);
            }
        }

    }
    //查表
    for (int i=0;i<matface.rows;i++)
    {
        for (int j=0;j<matface.cols;j++)
        {
            matface.at<Vec3b>(i,j)[0]=bluemap[matface.at<Vec3b>(i,j)[0]];
            matface.at<Vec3b>(i,j)[1]=greenmap[matface.at<Vec3b>(i,j)[1]];
            matface.at<Vec3b>(i,j)[2]=redmap[matface.at<Vec3b>(i,j)[2]];
        }
    }
    return matface;
}

 

目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
算法 C++
OpenCV-白平衡(灰度世界算法)
OpenCV-白平衡(灰度世界算法)
383 0
|
7月前
|
API 计算机视觉
【OpenCV】—图像对比度、亮度值调整
【OpenCV】—图像对比度、亮度值调整
|
7月前
|
计算机视觉
OpenCV图像阈值
OpenCV图像阈值
26 0
|
7月前
|
算法 计算机视觉 Python
OpenCV 4基础篇| OpenCV图像的裁切
OpenCV 4基础篇| OpenCV图像的裁切
|
7月前
|
计算机视觉
[OpenCV] 图像的几种滤波方式
[OpenCV] 图像的几种滤波方式
41 0
|
算法 C++
OpenCV-图像对比度
OpenCV-图像对比度
100 1
OpenCV-图像高光调整
OpenCV-图像高光调整
257 0
OpenCV-图像阴影调整
OpenCV-图像阴影调整
204 0
|
算法 C++
OpenCV-图像饱和度
OpenCV-图像饱和度
151 0
|
算法 计算机视觉
06 OpenCV 阈值处理、自适应处理与ostu方法
CV2中使用阈值的作用是将灰度图像二值化,即将灰度图像的像素值根据一个设定的阈值分成黑白两部分。阈值处理可以用于图像分割、去除噪声、增强图像对比度等多个领域。例如,在物体检测和跟踪中,可以通过对图像进行阈值处理来提取目标区域;在图像增强中,可以使用阈值处理来增强图像的轮廓和细节等。