原文:http://lib.csdn.net/article/opencv/28586 #include <opencv2/opencv.hpp> using namespace cv; using namespace std; class Histogram1D { private: int histsize[1]; float hranges[2]; const float* ranges[1]; int channels[1]; public: Histogram1D() { histsize[0] = 256 ; hranges[0] = 0.0; hranges[1] = 255.0; ranges[0] = hranges; channels[0] = 0; } Mat getHistogram(const Mat &image); Mat getHistogramImage(const Mat &image); Mat applyLookUp(const Mat &image); Mat stretch(const Mat &image, int minValue); }; Mat Histogram1D::getHistogram(const Mat &image) { Mat hist; calcHist(&image, 1, channels, Mat(), hist, 1, histsize, ranges); return hist; } Mat Histogram1D::getHistogramImage(const Mat &image) { Mat hist = getHistogram(image); double maxVal = 0; double minVal = 0; minMaxLoc(hist, &minVal, &maxVal); Mat histImg(histsize[0],histsize[0],CV_8UC3,Scalar(255,255,255)); int hpt = static_cast<int>(0.9*histsize[0]); for (int h = 0; h < histsize[0]; h++) { float binVal = hist.at<float>(h); int intensity = static_cast<int>(binVal * hpt / maxVal); line(histImg, Point(h, histsize[0]), Point(h,histsize[0] - intensity), Scalar(0,255,0)); } return histImg; } //Mat Histogram1D::applyLookUp(const Mat &image) //{ // Mat result; // Mat lookup(1, 256, CV_8U); // // for (int i = 0; i < 256; i++) // { // lookup.at<uchar>(i) = 255 -i; // } // // // LUT(image, lookup, result); // return result; //} Mat Histogram1D::stretch(const Mat &image, int minValue = 0 ) { Mat hist = getHistogram(image); int imin = 0; for (; imin < histsize[0]; imin++) { if (hist.at<float>(imin) > minValue ) { break; } } int imax = histsize[0] - 1; for(; imax >=0; imax--) { if (hist.at<float>(imax) > minValue) { break; } } int dim(256); Mat lookup(1, &dim, CV_8U); for (int i = 0; i < 256; i++) { if (i < imin ) { lookup.at<uchar>(i) = 0; } else if (i > imax) { lookup.at<uchar>(i) = 255; } else { lookup.at<uchar>(i) = static_cast<uchar>(255.0*(i - imin)/(imax - imin) + 0.5); } } Mat result; LUT(image,lookup,result); return result; } int main(int argc, char* argv[]) { Mat image = imread("lena.jpg",0); int sum = 0; int max = 0; Histogram1D h; /*Mat histo = h.getHistogramImage(image);*/ //for (int i = 0; i < 256; i++) //{ // if (histo.at<float>(i) > max) // { // max = histo.at<float>(i); // } // /*cout<<"Value"<<i<<"="<<histo.at<float>(i)<<endl;*/ // /*sum += histo.at<float>(i);*/ // //} //cout<<max<<endl; /*Mat dst = h.applyLookUp(image);*/ Mat dst = h.stretch(image); imshow("src",image); imshow("dst", dst); imshow("src H", h.getHistogramImage(image)); imshow("dst H", h.getHistogramImage(dst)); waitKey(0); return 0; }
opencv查找表值直方图均衡化
最新推荐文章于 2021-12-07 21:11:03 发布