/// <summary> /// Computes the thresholded gradient (Snatos97). /// </summary> /// <returns>The focus measure value</returns> double BasicFM::computeGRAT() { if (checkInput()) { cv::Mat dH = mSrcImg(cv::Range::all(), cv::Range(1, mSrcImg.cols)) - mSrcImg(cv::Range::all(), cv::Range(0, mSrcImg.cols - 1)); cv::Mat dV = mSrcImg(cv::Range(1, mSrcImg.rows), cv::Range::all()) - mSrcImg(cv::Range(0, mSrcImg.rows - 1), cv::Range::all()); //dH = cv::abs(dH); //dV = cv::abs(dV); //cv::Mat FM = cv::max(dH, dV); cv::Mat FM = cv::max(dH(cv::Range(0, dH.rows - 1), cv::Range::all()), dV(cv::Range::all(), cv::Range(0, dV.cols - 1))); double thr = 0; cv::Mat mask = FM >= thr; mask.convertTo(mask, CV_32FC1, 255.0); FM = FM.mul(mask); cv::Scalar fm = cv::sum(FM) / cv::sum(mask); //normalize mVal = fm[0] / 255.0; } return mVal; }
/// <summary> /// Computes the squared gradient in horizontal direction (Eskicioglu95) /// </summary> /// <returns>The focus measure value</returns> double BasicFM::computeGRAS() { if (checkInput()) { cv::Mat dH = mSrcImg(cv::Range::all(), cv::Range(1, mSrcImg.cols)) - mSrcImg(cv::Range::all(), cv::Range(0, mSrcImg.cols - 1)); dH = dH.mul(dH); cv::Scalar fm = cv::mean(dH); mVal = fm[0] / (255.0*255.0); } return mVal; }
/// <summary> /// Computes Brenner's focus measure and determines the ratio of the median/mean. /// </summary> /// <returns>The focus measure value</returns> double BasicFM::computeROGR() { if (checkInput()) { cv::Mat dH = mSrcImg(cv::Range::all(), cv::Range(1, mSrcImg.cols)) - mSrcImg(cv::Range::all(), cv::Range(0, mSrcImg.cols - 1)); cv::Mat dV = mSrcImg(cv::Range(1, mSrcImg.rows), cv::Range::all()) - mSrcImg(cv::Range(0, mSrcImg.rows - 1), cv::Range::all()); dH = cv::abs(dH); dV = cv::abs(dV); cv::Mat FM = cv::max(dH(cv::Range(0, dH.rows - 1), cv::Range::all()), dV(cv::Range::all(), cv::Range(0, dV.cols - 1))); FM = FM.mul(FM); cv::Scalar m = cv::mean(FM); cv::Mat tmp; FM.convertTo(tmp, CV_32F); double r = 255.0*255.0; //mVal = r > 0 ? m[0] / r : m[0]; mVal = m[0] / r; } return mVal; }
void SIG_VResample(nm8s* pSrcImg, int nSrcStride, int nSrcWidth, int nSrcHeight, int nP, int nQ, int nK, int nWindow, nm16s* pDstImg) { nmmtr8s mSrcImg(pSrcImg,nSrcHeight,nSrcWidth); nmmtr16s mDstImg(pDstImg,nSrcHeight*nP/nQ,nSrcWidth); const double PI=3.1415926535897932384626433832795; double fP=nP; double v; int k,i,j; int nFixpoint=64; if (nP>=nQ) { nmvec16s vKernel(nP*nK+1); vec<double> vHamming(nP*nK+1); vec<double> vImpulse(nP*nK+1); vec<double> vEnergy(nP); if(nK==1) { vImpulse.reset(); for(k=0;k<vKernel.size-1;k++) { vImpulse[k]=1; } } else { ASSERTE(nK%2==0); // Impulse function generation vImpulse[vImpulse.size/2]=1; for(k=1;k<=vKernel.size/2;k++) { v=sin(PI*double(k)/fP)/(PI*k/fP); //1.0/nP* vImpulse[vImpulse.size/2+k]=v; vImpulse[vImpulse.size/2-k]=v; } if (nWindow) { // Hamming window function generation for(k=0;k<vHamming.size;k++) { vHamming[k]=0.54-0.46*cos(2*PI*k/(vHamming.size-1)); } // multiplication of impulse response by Hamming window for(k=0;k<vImpulse.size;k++) { vImpulse[k]*=vHamming[k]; } } } vEnergy.reset(); for(i=0;i<nP;i++) for(k=i;k<vImpulse.size;k+=nP) vEnergy[i]+=vImpulse[k]; for(i=0;i<nP;i++) for(k=i;k<vImpulse.size;k+=nP) vImpulse[k]/=vEnergy[i]; // Filxed point kernel coefficient initialization for(k=0;k<vImpulse.size;k++) vKernel[k]=floor(vImpulse[k]*nFixpoint+0.5); nmvec8s vSrcUpsample(nSrcHeight*nP,nP*nK); // Up-Resampled vSrcVec by nP times nmvec16s vDstUpsample(nSrcHeight*nP); // Filtered vSrcUpsample vSrcUpsample.reset(); for(int x=0;x<nSrcWidth;x++) { int y; // Up-resampling by nP times for( y=0;y<nSrcHeight;y++) { vSrcUpsample[y*nP]= mSrcImg[y][x]; } // Filtration for(i=0;i<vSrcUpsample.size;i++) { nmvec8s vLocalSrcUpsample(vSrcUpsample.m_data+i-vKernel.size/2,vKernel.size); vDstUpsample[i]=vLocalSrcUpsample*vKernel; } // Decimation by 4 for(y=0,i=0;y<mDstImg.m_height;i+=nQ,y++) { mDstImg[y][x]=vDstUpsample[i].m_value; } } } }