怎么办_怎么做_How to do anything_解决问题万事OK

ACE图像增强算法Opencv实现

ACE图像增强算法Opencv实现

1. 概述
最近翻阅图像增强算法方面的文献,偶然中找到一篇博客是写的有关ACE图像增强算法的,算法的原理比较简单。本文章中使用到的基本计算方法也是从那篇文章中得到的,这里使用Opencv进行了简单的仿真,暴露出来的问题就是这个算法运算量相当大,特别是在运算窗口很大的时候。
这里作为记录就直接贴代码了,有兴趣的可以去查看他的博客原文。
2. 实现代码
//************************************************************************
// 函数名称:    ACE_Enhance
// 访问权限:    public 
// 创建日期:    2016/11/23
// 创 建 人:        
// 函数说明:    单通道增强
// 函数参数:    cv::Mat & src_img    输入图像
// 函数参数:    cv::Mat & dst_img    输出图像
// 函数参数:    unsigned int half_winSize    增强窗口的半窗大小
// 函数参数:    double Max_Q            最大Q值
// 返 回 值:    bool
//************************************************************************
bool CACE_Algorithm::ACE_Enhance(cv::Mat& src_img, cv::Mat& dst_img, unsigned int half_winSize, double Max_Q)
{
    if (!src_img.data)
    {
        cout << "没有输入图像" << endl;
        return false;
    }
 
    int rows(src_img.rows);
    int cols(src_img.cols);
    unsigned char* data = nullptr;
    unsigned char* data1 = nullptr;
    cv::Mat DstImg(rows, cols, CV_8UC1, cv::Scalar::all(0));
 
    //cv::Mat temp = src_img(cv::Rect(721 - half_winSize, 6 - half_winSize, half_winSize * 2 + 1, half_winSize * 2 + 1));    //截取窗口图像
 
    for (int i = half_winSize; i < (rows - half_winSize); i++)
    {
        data = DstImg.ptr<unsigned char>(i);
        data1 = src_img.ptr<unsigned char>(i);
        for (int j = half_winSize; j < (cols - half_winSize); j++)
        {
            cv::Mat temp = src_img(cv::Rect(j - half_winSize, i - half_winSize, half_winSize * 2 + 1, half_winSize * 2 + 1));    //截取窗口图像
            double MeanVlaue = this->GetMeanValue(temp);
            double varian = this->GetVarianceValue(temp, MeanVlaue);
            if (0 != varian)
            {
                double cg = 100.0 / std::sqrt(varian);
                cg = cg > Max_Q ? Max_Q : cg;
                double pixelvalue = cg*((double)data1[j] - MeanVlaue);
                
                int temp = MeanVlaue + pixelvalue;
                temp = temp > 255 ? 255 : temp;
                temp = temp < 0 ? 0 : temp;
                data[j] = temp;
            }
            else if (varian <= 0.01)    //方差较小的情况直接使用原始值进行替换,防止修改,2018.1.18修改
            {
                data[j] = data1[j];
            }
        }
    }
    dst_img = DstImg;
 
    return true;
}
 
//************************************************************************
// 函数名称:    GetMeanValue
// 访问权限:    public 
// 创建日期:    2016/11/18
// 创 建 人:        
// 函数说明:    获取图像的平均灰度值
// 函数参数:    cv::Mat & src_img    输入图像
// 返 回 值:    double
//************************************************************************
double CACE_Algorithm::GetMeanValue(cv::Mat& src_img)
{
    if (CV_8UC1 != src_img.type())
    {
        return -1.0;
    }
 
    int rows(src_img.rows);    //height
    int cols(src_img.cols);    //width
    unsigned char* data = nullptr;
    double PixelValueSum(0.0);    //总共的像素值
 
    for (int i = 0; i < rows; i++)
    {
        data = src_img.ptr<unsigned char>(i);
        for (int j = 0; j < cols; j++)
        {
            PixelValueSum += (double)data[j];
        }    //计算图像的总共像素值
    }
 
    double result(PixelValueSum / static_cast<double>(rows*cols));    //计算图像的均值
 
    return result;
}
 
//************************************************************************
// 函数名称:    GetVarianceValue
// 访问权限:    public 
// 创建日期:    2016/11/18
// 创 建 人:        
// 函数说明:        计算图像的均方差
// 函数参数:    cv::Mat & src_img    输入图像
// 函数参数:    double MeanVlaue        图像的均值
// 返 回 值:    double
//************************************************************************
double CACE_Algorithm::GetVarianceValue(cv::Mat& src_img, double MeanVlaue)
{
    if (CV_8UC1 != src_img.type())
    {
        return -1.0;
    }
 
    int rows(src_img.rows);    //height
    int cols(src_img.cols);    //width
    unsigned char* data = nullptr;
    double PixelValueSum(0.0);    //总共的像素值
 
    for (int i = 0; i < rows; i++)
    {
        data = src_img.ptr<unsigned char>(i);
        for (int j = 0; j < cols; j++)
        {
            PixelValueSum += std::pow((double)(data[j] - MeanVlaue), 2);
        }    //计算图像方差
    }
 
    double result(PixelValueSum / static_cast<double>(rows*cols));    //计算图像的均方差
 
    return result;
}

3. 效果

 
【关键字】:

此文由 yeaso   万事OK网编辑:首页 > IT » ACE图像增强算法Opencv实现

相关推荐

© 2020 怎么办_怎么做_How to do anything_解决问题万事OK  京ICP备13039979号-5