首页 > 编程语言 > 详细

opencv C++全局直方图均衡化

时间:2019-09-17 21:07:04      阅读:137      评论:0      收藏:0      [点我收藏+]
cv::Mat histogramEqualization(cv::Mat img){
   int rows=img.rows;
   int cols=img.cols;
   cv::Mat grayScale=cv::Mat::zeros(cv::Size(256,1),CV_32SC1);
   cv::Mat grayScaleSum=cv::Mat::zeros(cv::Size(256,1),CV_32SC1);
   cv::Mat _output=cv::Mat::zeros(cv::Size(256,1),CV_8UC1);
   cv::Mat output=cv::Mat::zeros(img.size(),CV_8UC1);
   float cofficient=256.0/(rows*cols);

   for(int i=0;i<rows;++i){  // 计算不同灰度值的个数。
       for(int j=0;j<cols;++j){
           int index=int(img.at<uchar>(i,j));
           grayScale.at<int>(0,index)+=1;
       }
   }

   for(int j=0;j<256;++j){
       if(j==0)grayScaleSum.at<int>(0,j)=grayScale.at<int>(0,0);
       else grayScaleSum.at<int>(0,j)=grayScaleSum.at<int>(0,j-1)+grayScale.at<int>(0,j);
   }


   for(int i=0;i<256;++i){
       float q=cofficient*grayScaleSum.at<int>(0,i)-1;
       if(q>=0)_output.at<uchar>(0,i)=uchar(floor(q));  // floor(x)Largest integer not greater than X.
       else _output.at<uchar>(0,i)=0;
   }

   for(int i=0;i<rows;++i){
       for(int j=0;j<cols;++j){
           int p=img.at<uchar>(i,j);
           output.at<uchar>(i,j)=_output.at<uchar>(0,p);
       }
   }
   return output;
}

int main(){
    cv::Mat img=cv::imread("/home/nan/图片/openimage/girl.jpg",cv::IMREAD_GRAYSCALE);
    cv::imshow("img",img);
    //cv::Mat output= equalHist(img);
    cv::Mat output= histogramEqualization(img);
    cv::imshow("全局直方图均衡化",output);
    cv::waitKey(0);
    return 0;
}

技术分享图片

opencv C++全局直方图均衡化

原文:https://www.cnblogs.com/ligei/p/11536906.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!