Esempio n. 1
0
Matrix2 psf2otf(Matrix& psf, Matrix& outSize)
{
	Matrix psfSize(1, 2);
	psfSize(0, 0) = psf.size1();
	psfSize(0, 1) = psf.size2();
	Matrix padSize(1, 2);
	padSize = outSize - psfSize;
	psf = padarray(psf, padSize);
	psf = circshift(psf, -Matfloor(psfSize / 2));
	Matrix2 otf = fft2(psf);
	return otf;
}
Esempio n. 2
0
//
// Arguments    : const emxArray_real_T *I
//                emxArray_real_T *I2
// Return Type  : void
//
void fillimg(const emxArray_real_T *I, emxArray_real_T *I2)
{
  emxArray_real_T *mask;
  int i16;
  int b_mask;
  int c_mask;
  emxArray_real_T *marker;
  b_emxInit_real_T(&mask, 2);
  padarray(I, mask);
  i16 = mask->size[0] * mask->size[1];
  emxEnsureCapacity((emxArray__common *)mask, i16, (int)sizeof(double));
  b_mask = mask->size[0];
  c_mask = mask->size[1];
  b_mask *= c_mask;
  for (i16 = 0; i16 < b_mask; i16++) {
    mask->data[i16] = 1.0 - mask->data[i16];
  }

  b_emxInit_real_T(&marker, 2);
  i16 = marker->size[0] * marker->size[1];
  marker->size[0] = mask->size[0];
  marker->size[1] = mask->size[1];
  emxEnsureCapacity((emxArray__common *)marker, i16, (int)sizeof(double));
  b_mask = mask->size[0] * mask->size[1];
  for (i16 = 0; i16 < b_mask; i16++) {
    marker->data[i16] = mask->data[i16];
  }

  for (b_mask = 0; b_mask <= mask->size[0] - 3; b_mask++) {
    i16 = marker->size[1];
    for (c_mask = 0; c_mask <= i16 - 3; c_mask++) {
      marker->data[(b_mask + marker->size[0] * (c_mask + 1)) + 1] = rtMinusInf;
    }
  }

  i16 = I2->size[0] * I2->size[1];
  I2->size[0] = marker->size[0];
  I2->size[1] = marker->size[1];
  emxEnsureCapacity((emxArray__common *)I2, i16, (int)sizeof(double));
  b_mask = marker->size[0] * marker->size[1];
  for (i16 = 0; i16 < b_mask; i16++) {
    I2->data[i16] = marker->data[i16];
  }

  imreconstruct(I2, mask);
  i16 = I2->size[0] * I2->size[1];
  emxEnsureCapacity((emxArray__common *)I2, i16, (int)sizeof(double));
  b_mask = I2->size[0];
  c_mask = I2->size[1];
  b_mask *= c_mask;
  for (i16 = 0; i16 < b_mask; i16++) {
    I2->data[i16] = 1.0 - I2->data[i16];
  }

  b_mask = marker->size[0] - 2;
  i16 = mask->size[0] * mask->size[1];
  mask->size[0] = b_mask;
  emxEnsureCapacity((emxArray__common *)mask, i16, (int)sizeof(double));
  b_mask = marker->size[1] - 2;
  i16 = mask->size[0] * mask->size[1];
  mask->size[1] = b_mask;
  emxEnsureCapacity((emxArray__common *)mask, i16, (int)sizeof(double));
  b_mask = (marker->size[0] - 2) * (marker->size[1] - 2);
  for (i16 = 0; i16 < b_mask; i16++) {
    mask->data[i16] = 0.0;
  }

  for (b_mask = 0; b_mask <= marker->size[0] - 3; b_mask++) {
    for (c_mask = 0; c_mask <= marker->size[1] - 3; c_mask++) {
      mask->data[b_mask + mask->size[0] * c_mask] = I2->data[(b_mask + I2->size
        [0] * (c_mask + 1)) + 1];
    }
  }

  emxFree_real_T(&marker);
  i16 = I2->size[0] * I2->size[1];
  I2->size[0] = mask->size[0];
  I2->size[1] = mask->size[1];
  emxEnsureCapacity((emxArray__common *)I2, i16, (int)sizeof(double));
  b_mask = mask->size[0] * mask->size[1];
  for (i16 = 0; i16 < b_mask; i16++) {
    I2->data[i16] = mask->data[i16];
  }

  emxFree_real_T(&mask);
}
Esempio n. 3
0
// Given the image of a person, get the axes, and return the map of kernel;
cv::Mat ReidDescriptor::map_kernel(cv::Mat img, int delta1, int delta2, float alpha, float varW, int H, int W, int &TLanti, int &HDanti,cv::Mat MSK)
{
	// UPLOADING AND FEATURE EXTRACTION
	if(MSK.empty()) {
		MSK = cv::Mat::ones(cv::Size(W, H), CV_8U);
	}

	// (me) Wouldn't it be quicker to just create a image of the same size rather than clone it ?
	cv::Mat img_hsv = img.clone();
	// Matlab:0:1,0:1,0:1 ; Opencv:0:255,0:255,0:180
	cv::Mat img_cielab = img.clone();
	// Matlab:0:255,0:255,0:255 ; Opencv:0:255,0:255,0:255
	cvtColor(img, img_hsv, CV_BGR2HSV);
	cvtColor(img, img_cielab, CV_BGR2Lab);

	// (me) Normalisation...?
	vector<cv::Mat> temp;
	split(img_hsv, temp);
	temp[0].convertTo(temp[0], CV_32FC1, 1 / 180.f);
	temp[1].convertTo(temp[1], CV_32FC1, 1 / 255.f);
	temp[2].convertTo(temp[2], CV_32FC1, 1 / 255.f);
	merge(temp, img_hsv);

	//double m, M;
	//cv::minMaxLoc(img_hsv,&m,&M);
	//imshow("imghsv",temp[0]);
	//cv::normalize(img_hsv,img_hsv,CV_MINMAX);

	TLanti = fminbnd(dissym_div, img_hsv, MSK, delta1, alpha, delta1, H - delta1);
	//cout << dissym_div(33, img_hsv, MSK, delta1, alpha)<<endl;
	//cout << dissym_div(34, img_hsv, MSK, delta1, alpha) << endl;
	int BUsim = fminbnd(sym_div, img_hsv.rowRange(0, img_hsv.rows), MSK.rowRange(0, img_hsv.rows), delta2, alpha, delta2, W - delta2);
	//cout << sym_div(18, img_hsv.rowRange(0, TLanti + 1), MSK.rowRange(0, TLanti + 1), delta2, alpha) << endl;
	//cout << sym_div(35, img_hsv.rowRange(0, TLanti + 1), MSK.rowRange(0, TLanti + 1), delta2, alpha) << endl;
	//int LEGsim = fminbnd(sym_div, img_hsv.rowRange(TLanti, img_hsv.rows), MSK.rowRange(TLanti, MSK.rows), delta2, alpha, delta2, W - delta2);
	HDanti = fminbnd(sym_dissimilar_MSKH, img_hsv, MSK, delta1, 0, 5, TLanti);

	//cv::Mat img_show = img.clone();
	//line(img_show, cv::Point(0, TLanti), cv::Point(W, TLanti), cv::Scalar(255, 0, 0));
	//line(img_show, cv::Point(0, HDanti), cv::Point(W, HDanti), cv::Scalar(255, 0, 0));
	//line(img_show, cv::Point(BUsim, HDanti), cv::Point(BUsim, TLanti), cv::Scalar(255, 0, 0));
	//line(img_show, cv::Point(LEGsim, TLanti), cv::Point(LEGsim, H), cv::Scalar(255, 0, 0));
	//imshow("test", img_show);
	//cv::waitKey(0);

	// Kernel - map computation
	vector<cv::Mat> img_split;
	split(img_hsv, img_split);
	img_split[2].convertTo(img_split[2], CV_8UC1, 255);
	equalizeHist(img_split[2], img_split[2]);
	img_split[2].convertTo(img_split[2], CV_32FC1, 1.0 / 255);
	merge(img_split, img_hsv);

	//cv::Mat HEADW = cv::Mat::zeros(cv::Size(W, HDanti + 1), CV_32FC1);

	//cv::Mat UP = img_hsv.rowRange(HDanti + 1, TLanti + 1);
	cv::Mat UP = img_hsv.rowRange(0, img_hsv.rows);
	cv::Mat UPW = gau_kernel(BUsim, varW, UP.rows, W);

	//cv::Mat DOWN = img_hsv.rowRange(TLanti + 1, img_hsv.rows);
	//cv::Mat DOWNW = gau_kernel(LEGsim, varW, DOWN.rows, W);

	cv::Mat MAP_KRNL = UPW / max_value(UPW);
	//cv::Mat MAP_KRNL = HEADW.clone() / max_value(HEADW);
	//MAP_KRNL.push_back(cv::Mat(UPW / max_value(UPW)));
	//MAP_KRNL.push_back(cv::Mat(DOWNW / max_value(DOWNW)));

	if (H - MAP_KRNL.rows > 0) {
		MAP_KRNL = padarray(MAP_KRNL, H - MAP_KRNL.rows);
	} else {
		MAP_KRNL = MAP_KRNL.rowRange(0, H);
	}

	//cv::imshow("map_kernel", MAP_KRNL);
	//cv::waitKey(0);
	return MAP_KRNL;
}
Esempio n. 4
0
/*----------------------------------------------------------------------------------------------------------------------------------------- */
void mlhoee_spyr(double *I , double *H, int ny , int nx  , int nH , int dimcolor , struct opts options  )
{
	double *spyr = options.spyr , *norma = options.norma  , *kernelx = options.kernelx , *kernely = options.kernely;
	double min_bin , max_bin , diff_bin ;
	double bin_size , center_offset , mini_b , f , absf;
	double clamp = options.clamp , temp , scaley , scalex, angle , mag , tempsx , tempsy  , ratiox , ratioy  , maxfactor = 0.0  , ratio;

	int i , j , p , l , x , y , o , q , v ;
	int kyy = options.kyy , kxy = options.kxy , kyx = options.kyx , kxx = options.kxx , bndori = options.bndori;
	int nspyr = options.nspyr , nori = options.nori  , norm = options.norm , nori2 = nori - 1 , interpolate = options.interpolate;
	int by , bx , ly , lx, pady , padx , nypad , nxpad , nypadnxpad , nynew , nxnew , nynxnew ,  nx1, ny1 , ny1nx1 , nygrady , nxgrady , nygradx , nxgradx; 	
	int indjx , indjy , indjm , indi , indj , index , indexo , indexp  , indtmpx , indtmpy , bin , nhd_bin;
	int deltay, deltax, sy , sx, origy, origx , offsety , offsetx , offy , offx , extraoy , extraox , offye , offxe, x0 , y0 , x1 , y1;

	int offyx , eyx , offxx , exx , offyy , eyy , offxy , exy , sf;
	int nynx = ny*nx , norinH = nori*nH , vnynx , vnorinH;

	double *Ipaded;
	double *grady , *gradx  , *R , *m  , *sat , *cell;

	if(bndori == 0)
	{
		min_bin  = -PI/2;
		max_bin  = PI/2;		    
	}
	else	
	{
		min_bin = -PI;
		max_bin = PI;
	}

	diff_bin      = (max_bin - min_bin);
    bin_size      = diff_bin/nori;
	center_offset = bin_size*0.5;
	mini_b        = min_bin+center_offset;



	for (p = 0 ; p < nspyr ; p++)
	{
		maxfactor   = max(maxfactor , spyr[p + 0]*spyr[p + nspyr]);
	}


    by          = (int) ceil(ny*norma[0]);
	bx          = (int) ceil(nx*norma[1]);

    nynew       = ((int) ceil(ny/(double)by))*by;
    nxnew       = ((int) ceil(nx/(double)bx))*bx;

	nynxnew     = nynew*nxnew;

	ratioy      = (nynew - ny)/2.0;
	offy        = (int) floor(ratioy);
	extraoy     = (int) ceil((ratioy - offy)/2.0);
	offye       = offy + extraoy;

	ratiox      = (nxnew - nx)/2.0;
	offx        = (int) floor(ratiox);
	extraox     = (int) ceil((ratiox - offx)/2.0);
	offxe       = offx + extraox;

/*
	pady        = max(1  , max(offy , max(kyx , kyy)));
    padx        = max(1  , max(offx , max(kxx , kxy)));

*/
	pady        = max(1  , max(offye , max(kyx , kyy)));
    padx        = max(1  , max(offxe , max(kxx , kxy)));


	nypad       = ny + 2*pady;
	nxpad       = nx + 2*padx;
	nypadnxpad  = nypad*nxpad; 

	offyx       = (int) (floor((kyx + 1)/2));
	eyx         = 2*offyx - kyx;

	offxx       = (int) (floor((kxx + 1)/2));
	exx         = 2*offxx - kxx;

	offyy       = (int) (floor((kyy + 1)/2));
	eyy         = 2*offyy - kyy;

	offxy       = (int) (floor((kxy + 1)/2));
	exy         = 2*offxy - kxy;


	Ipaded      = (double *)malloc(nypadnxpad*sizeof(double));


    nygrady     = nypad + kyy - 1;
	nxgrady     = nxpad + kxy - 1;
	nygradx     = nypad + kyx - 1;
	nxgradx     = nxpad + kxx - 1;


	grady       = (double *)malloc(nygrady*nxgrady*sizeof(double));
	gradx       = (double *)malloc(nygradx*nxgradx*sizeof(double));


	R           = (double *)malloc(nynxnew*nori*sizeof(double));
	m           = (double *)malloc(nynxnew*sizeof(double));

	nx1         = nxnew + 1;
	ny1         = nynew + 1;
	ny1nx1      = ny1*nx1;

	sat         = (double *)malloc(ny1nx1*sizeof(double));
	cell        = (double *)malloc(5*nH*sizeof(double));


	for (v = 0 ; v < dimcolor ; v++)
	{
		vnynx      = v*nynx;
		vnorinH    = v*norinH;


		/* Pading */

		for(i = 0 ; i < nypadnxpad ; i++)
		{
			Ipaded[i] = 0.0;
		}


		padarray(I + vnynx , ny , nx , pady , padx , Ipaded);

		/* Gradient computation */

		conv2(Ipaded , kernely , nypad , nxpad , kyy , kxy , nygrady , nygrady , grady);
		conv2(Ipaded , kernelx , nypad , nxpad , kyx , kxx , nygradx , nxgradx , gradx);
/*
		indtmpx     = max(0,padx + offxx - exx - offxe); 
		indtmpy     = max(0,pady + offxy - exy - offxe);

		indtmpx     = padx + offxx - exx - offxe; 
		indtmpy     = pady + offxy - exy - offxe;
*/


		indtmpx     = max(0,padx + offxx - exx - offxe); 
		indtmpy     = max(0,padx + offxy - exy - offxe);

		for (i = 0 ; i < nynxnew*nori ; i++)
		{
			R[i] = 0.0;
		}

		if(bndori == 0)
		{
			for(j = 0  ; j < nxnew  ; j++)
			{		
				indjx                         = pady + offyx - eyx - offye  + (j + indtmpx)*nygradx;
				indjy                         = pady + offyy - eyy - offye  + (j + indtmpy)*nygrady;
				indjm                         = j*nynew;

				for(i = 0 ; i < nynew ; i++)
				{
					tempsx                       = gradx[i + indjx];
					tempsy                       = grady[i + indjy];

					angle                        = atan(tempsy/(tempsx + verytiny));  
					mag                          = sqrt((tempsx*tempsx) + (tempsy*tempsy)); 

					bin                          = min(nori2 , max(0 , (int)floor(nori*(angle - min_bin)/diff_bin)));

					if(interpolate)
					{

						f                              = (angle - (mini_b + bin*bin_size))/bin_size;
						absf                           = fabs(f);
						sf                             = sign(f);
						nhd_bin                        = mymod(bin + sf  , nori2);
						R[i + indjm + bin*nynxnew]     = mag*(1.0 - absf);
						R[i + indjm + nhd_bin*nynxnew] = mag*absf;

					}
					else
					{
						R[i + indjm + bin*nynxnew]   = mag;
					}

					m[i + indjm]                 = mag; 

				}
			}
		}
		else
		{
			for(j = 0  ; j < nxnew  ; j++)
			{		
				indjx                         = pady + offyx - eyx - offye  + (j + indtmpx)*nygradx;
				indjy                         = pady + offyy - eyy - offye + (j + indtmpy)*nygrady;
				indjm                         = j*nynew;

				for(i = 0 ; i < nynew ; i++)
				{
					tempsx                       = gradx[i + indjx];
					tempsy                       = grady[i + indjy];

					angle                        = atan2(-tempsy , -(tempsx + verytiny));  
					mag                          = sqrt((tempsx*tempsx) + (tempsy*tempsy)); 

					bin                          = min(nori2 , max(0 , (int)floor(nori*(angle - min_bin)/diff_bin)));

					if(interpolate)
					{
						f                              = (angle - (mini_b + bin*bin_size))/bin_size;
						absf                           = fabs(f);
						sf                             = sign(f);
						nhd_bin                        = mymod(bin + sf  , nori2);
						R[i + indjm + bin*nynxnew]     = mag*(1.0 - absf);
						R[i + indjm + nhd_bin*nynxnew] = mag*absf;

					}
					else
					{
						R[i + indjm + bin*nynxnew]   = mag;
					}

					m[i + indjm]                 = mag; 

				}
			}
		}


		/* L1 block-normalization via the Integral Image*/


		for(i = 0 ; i < ny1nx1 ; i++)
		{
			sat[i]   = 0.0;
		}

		for (j=1 ; j < nx1; j++)
		{
			indj  =  j*ny1;
			index =  indj - ny1;
			indi  =  (j-1)*nynew;
			for (i = 1 ; i < ny1 ; i++)
			{
				sat[i + indj] = sat[i-1 + indj] + sat[i + index] - sat[(i-1) + index] + m[(i-1) + indi]; 
			}
		}

		for(l = 0 ; l < (nxnew/bx)  ; l++)
		{
			x  = l*bx;
			for(p = 0 ; p < (nynew/by)  ; p++)
			{
				y     = p*by;
				x1    = x + bx;
				y1    = y + by;

				temp  = (sat[y1 + x1*ny1] - (sat[y1 + x*ny1] + sat[y + x1*ny1]) + sat[y + x*ny1]);
				if(temp != 0.0)
				{
					temp  = 1.0/temp; 
				}
				else
				{
					temp = 1.0;
				}
				for (o = 0 ; o < nori ; o++)
				{
					index = o*nynxnew;
					for(i = x ; i < x + bx ; i++)
					{
						indi = i*nynew + index;
						for(j = y ; j < y + by ; j++)
						{
							R[j + indi] *= temp;
						}
					}
				}
			}
		}


		/*---- Orientation block definitions ----  */

		index          = 0;
		for (p = 0 ; p < nspyr ; p++)
		{
			scaley      = (spyr[p + nspyr*2]);
			ly          = (int) ( (1 - spyr[p + 0])/scaley + 1);
			deltay      = (int) (ny*scaley);
			sy          = (int) (ny*spyr[p + 0]);
			offsety     = max(0 , (int) ( floor(ny - ( (ly-1)*deltay + sy + 1)) ));

			scalex      = (spyr[p + nspyr*3]);
			lx          = (int) ( (1 - spyr[p + nspyr*1])/scalex + 1);
			deltax      = (int) (nx*scalex);
			sx          = (int) (nx*spyr[p + nspyr*1]);
			offsetx     = max(0 , (int) ( floor(nx - ( (lx-1)*deltax + sx + 1)) ));


			ratio       = maxfactor/(spyr[p + 0]*spyr[p + nspyr]);

			for(l = 0 ; l < lx ; l++) /* Loop shift on x-axis */
			{
				origx  = offsetx + l*deltax ;

				for(q = 0 ; q < ly ; q++)   /* Loop shift on y-axis  */
				{
					origy             = offsety + q*deltay ;

					cell[0 + index]   = origy + offye;
					cell[1 + index]   = origx + offxe;
					cell[2 + index]   = origy + sy;
					cell[3 + index]   = origx + sx;
					cell[4 + index]   = ratio;
					index            += 5;

				}
			}
		}

		/*---- Compute Oriented Edge Energy via the cumulated Integral Image over each orientations ----  */

		for(i = 0 ; i < ny1nx1 ; i++)
		{
			sat[i] = 0.0;
		}

		for (o = 0 ; o < nori ; o++)
		{
			indexo = o*nynxnew;
			for (j = 1 + offxe; j<nx1; j++)
			{
				indj  =  j*ny1;
				index =  indj - ny1;
				indi  = (j-1)*nynew;

				for (i = 1 + offye ; i<ny1; i++)
				{
					sat[i + indj] = sat[i-1 + indj] + sat[i + index] - sat[(i-1) + index] + R[(i-1) + indi + indexo]; 
				}
			}

			index  = 0;
			indexp = o*nH + vnorinH; 

			for (j=0 ; j < nH ; j++)
			{
				y0                     = (int) cell[0 + index];
				x0                     = (int) cell[1 + index];
				y1                     = (int) cell[2 + index];
				x1                     = (int) cell[3 + index];

				H[j + indexp]          = (sat[y1 + x1*ny1] - (sat[y1 + x0*ny1] + sat[y0 + x1*ny1]) + sat[y0 + x0*ny1])*cell[4 + index];
				index                 += 5;
			}
		}

		/*---- Normalization ----  */

		if(norm == 1) /* L1-norm */
		{		
			for(j = 0 ; j < nH ; j++)
			{
				indj  = j*nori + vnorinH;
				temp  = 0.0;
				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += H[i];
				}

				temp  = 1.0/(temp + tiny);

				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  *= temp;

				}
			}
		}
		if(norm == 2)  /* L2-norm */
		{
			for(j = 0 ; j < nH ; j++)
			{
				indj  = j*nori + vnorinH;
				temp  = 0.0;

				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += (H[i]*H[i]);
				}

				temp  = 1.0/sqrt(temp + verytiny);
				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  *= temp;

				}
			}
		}
		if(norm == 3)  /* L1-sqrt */
		{
			for(j = 0 ; j < nH ; j++)
			{
				indj  = j*nori + vnorinH;
				temp  = 0.0;

				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += H[i];
				}

				temp  = 1.0/(temp + tiny);
				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  = sqrt(H[i]*temp);

				}
			}
		}
		if(norm == 4)  /* L2-clamped */
		{
			for(j = 0 ; j < nH ; j++)
			{
				indj  = j*nori + vnorinH;
				temp  = 0.0;
				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += (H[i]*H[i]);
				}
				temp  = 1.0/sqrt(temp + verytiny);
				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  *= temp;

					if(H[i] > clamp)
					{
						H[i] = clamp;
					}
				}
				temp  = 0.0;
				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += (H[i]*H[i]);
				}

				temp  = 1.0/sqrt(temp + verytiny);
				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  *= temp;
				}
			}
		}
	}
	free(Ipaded);
	free(grady);
	free(gradx);
	free(R);
	free(m);
	free(sat);
	free(cell);
}