标签:visual c++ opencv2 同态滤波器 冈萨雷斯
这次使用的是经典教材——冈萨雷斯 数字图像处理(第二版)
P152-154 4.5同态滤波器 附上下载地址http://dl.dbank.com/c0atzs7h2g#
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">理论部分就不叨叨了,直接上代码,写的感觉有点问题,求指导。</span>
void HomoFilter(Mat srcImg, Mat &dst) { srcImg.convertTo(srcImg, CV_64FC1); dst = Mat::zeros(srcImg.rows, srcImg.cols, CV_64FC1); // 构造滤波矩阵 Mat H_u_v; double gammaH = 1.5; double gammaL = 0.5; double C = 1; double d0 = (srcImg.rows/2)*(srcImg.rows/2) + (srcImg.cols/2)*(srcImg.cols/2); double d2 = 0; H_u_v = Mat::zeros(srcImg.rows, srcImg.cols, CV_64FC1); for (int i = 0; i < srcImg.rows; i++) { double * dataH_u_v = H_u_v.ptr<double>(i); for (int j = 0; j < srcImg.cols; j++) { d2 = pow((i - srcImg.rows/2), 2.0) + pow((j - srcImg.cols/2), 2.0); dataH_u_v[j] = (gammaH - gammaL)*(1 - exp(-C*d2/d0)) + gammaL; } } for (int i = 0; i < srcImg.rows; i++) { double* srcdata = srcImg.ptr<double>(i); double* logdata = dst.ptr<double>(i); for (int j = 0; j < srcImg.cols; j++) { logdata[j] = log(srcdata[j]+1.0); } } //%%%%%%%%%%%%%%%%%%%%%%%傅里叶变换、滤波、傅里叶反变换%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Mat planes[] = {dst, Mat::zeros(dst.size(), CV_64F)}; Mat complexI; merge(planes, 2, complexI); // Add to the expanded another plane with zeros dft(complexI, complexI); // this way the result may fit in the source matrix // compute the magnitude and switch to logarithmic scale // => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2)) split(complexI, planes); Mat IDFT[] = {Mat::zeros(dst.size(), CV_64F), Mat::zeros(dst.size(), CV_64F)}; IDFT[0] = H_u_v.mul(planes[0]);//planes[0].mul(H_u_v); IDFT[1] = H_u_v.mul(planes[1]);//planes[1].mul(H_u_v); merge(IDFT, 2, complexI); idft(complexI, complexI); split(complexI, IDFT); for (int i = 0; i < srcImg.rows; i++) { double* dataRe = IDFT[0].ptr<double>(i); double* dataIm = IDFT[1].ptr<double>(i); double* logdata = dst.ptr<double>(i); for (int j = 0; j < srcImg.cols; j++) { if (dataIm[j] < 0) { logdata[j] = dataRe[j]*dataRe[j] - dataIm[j]*dataIm[j]; } else { logdata[j] = dataRe[j]*dataRe[j] + dataIm[j]*dataIm[j]; } } } normalize(dst, dst, 0, 5.545, CV_MINMAX); for (int i = 0; i < srcImg.rows; i++) { double* logdata = dst.ptr<double>(i); for (int j = 0; j < srcImg.cols; j++) { logdata[j] = pow(2.718281828, logdata[j]) - 1.0; } } dst.convertTo(dst, CV_8UC1);; }
标签:visual c++ opencv2 同态滤波器 冈萨雷斯
原文地址:http://blog.csdn.net/liquan1434/article/details/44871053