Opencv彩色图像均衡问题

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
Mat image,image_eq;
int main(void){
 image=imread("D:\\testpic\\lena.jpg");
 if(!image.data){
  cout<<"can't load image"<<endl;
 }
 image_eq.create(image.rows, image.cols, CV_8UC3);
 //separate channels, equalize histograms and them merge them
 vector<Mat> channels, channels_eq;
 split(image, channels);
 Mat eq;
 for(int i = 0; i < channels.size(); i++) {
  //Mat eq;
  //eq.release();
  equalizeHist(channels[i], eq);
  channels_eq.push_back(eq);
 }
 merge(channels_eq, image_eq);
 imshow("equalizeHist",image_eq);
 while(char(cv::waitKey(1))!='q'){
 }
 return 0;
}

后来在机器学习群里和大家讨论后发现原来应该这么理解:
当Mat eq放在外面的时候,equalizeHist在内部在create新的Mat的时候发现需要的Mat的shape,type和原来是一样的,就立即返回了(可以看看opencv中create的文档说明),所以第二次(第三次)equalizeHist其实得到的结果存到了同一个地址空间中,而Mat作为一个智能指针,push_back的时候只是把Mat的头push进去了。所以经过三次处理之后,在merge的时候其实只有一个通道的数据,即最后一次equalizeHist得到的结果的3个copy。
如果加上release之后,问题也能解决。因为release之后数据地址会重新分配,对应的Mat头也不一样了….

你可能感兴趣的:(opencv)