ACE图像增强算法Opencv实现

来源:互联网 发布:开源元数据管理工具 编辑:程序博客网 时间:2024/05/16 12:18

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;}}}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);//heightint cols(src_img.cols);//widthunsigned 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);//heightint cols(src_img.cols);//widthunsigned 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. 效果


1 0
原创粉丝点击