예제 #1
0
	/// <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;
	}
예제 #2
0
	/// <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;
	}
예제 #3
0
	/// <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;
	}
예제 #4
0
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;
			}
		}

	}
}