赞
踩
Mat calcGrayHist(const Mat & image) { Mat histogram = Mat::zeros(Size(256, 1), CV_32SC1);//存储256个灰度级的像素个数 int rows = image.rows; int cols = image.cols;//图像的宽和高 //计算灰度级个数 for(int r = 0; r < rows; r++) { for(int c = 0; c < cols; c++) { int index = int(image.at<uchar>(r,c)); histogram.at<int>(0,index) += 1; } } return histogram; }
Mat::convertTo(Outputarray m, int rtype, double alpha = 1, double beta = 0)
//使用Mat的成员函数,alpha和beta分别代表a,b
convertScaleAbs(InputArray src, OutputArray dst, double alpha = 1, double beta = 0)
//使用OpenCV提供的函数
//examples
Mat I = (Mat_<uchar>(2,2) << 0, 200, 23, 4);
Mat O;
I.convertTo(O, CV_8UC1, 2.0, 0);//方法1
//输出结果为[[0,255],[46,8]]
Mat O = 3.5*I;//方法2
//输出结果为[[0,255],[80,14]]
convertScaleAbs(I, O, 2.0, 0);//方法3
//输出结果为[[0,255],[46,8]]
//计算原图出现的最小灰度级和最大灰度级
void minMaxLoc(InputArray src, double* minVal, double* maxVal = 0, Point* minLoc = 0, Point* maxLoc = 0, InputArray mask = noArray())
//src-输入矩阵
//minVal-最小值,maxVal-最大值
//minLoc-最小值位置,maxLoc-最大值位置
minMaxLoc(src, &minval, &maxVal, NULL, NULL)//值计算最大值和最小值
//exampls
Mat I = imread(argv[1], LOAD_IMAGE_GRAYSCALE);//输入图像矩阵
double Imax, Imin;
minMaxLoc(I, &Imin, &Imax, NULL, NULL);//找到最大、最小值
double Omin = 0, Omax = 255;
double a = (Omax - Omin)/(Imax - Imin);
double b = Omin - a * Imin;//计算a和b
Mat O;
convertScaleAbs(I, O, a, b);//线性变换
void normalize(InputArray src, OutputArray dst, double alpha=1, doubla beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray())
//src-输入矩阵,dst-输出矩阵
//alpha-结构元的锚点,beta-腐蚀操作次数
//norm_type-边界扩充类型,dtype-边界扩充值
void pow(InputArray src, double power, OutputArray dst)
Mat equalHist(Mat image) { CV_Assert(image.type() == CV_8UC1); int rows = image.rows; int cols = image.cols; //1.计算图像灰度直方图 Mat grayHist = calaGrayHist(image); //2.计算累加灰度直方图 Mat zeroCumuMoment = Mat::Zeros(Size(256,1),CV_32SC1); for(int p = 0; p < 256; p++) { if(P == 0) zeroCumuMoment.at<int>(0,p) = grayHist.at<int>(0,0); else zeroCumuMoment.at<int>(0,p) = zeroCumuMoment.at<int>(0,p-1) +grayHist.at<int>(0,p); } //3.根据累加直方图获得映射关系 Mat outPut_q = Mat::Zeros(Size(256,1),CV_8UC1); float cofficient = 256.0/(rows*cols); for(int p = 0; p < 256; p++) { float q = cofficient * zeroCumuMoment.at<int>(0,p) - 1; if(q >= 0) outPut_q.at<uchar>(0,p) = uchar(floor(q)); else outPut_q.at<uchar>(0,p) = 0; } //4.得到直方图均衡化后的图像 Mat equalHistImage = Mat::zeros(image.size(),CV_8UC1); for(int r = 0; r < rows; r++) { for(int c = 0; c < cols; c++) { int p = image.at<uchar>(r,c); equalHistImage .at<uchar>(r,c) = outPut_q.at<uchar>(0,p); } } return equalHistImage; }
Ptr<CLANE> clahe = createCLANE(2.0,Size(8,8));
clahe->apply(src,dst);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。