亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? imagesegmentation.cpp

?? 圖像分割算法
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
					LabelAvg(label) += grads(y,x);

					while(tmpQ.size() > 0)
					{
						Point p = tmpQ.front();
						tmpQ.pop();

						for (int i=-1; i<=1; i++) 
						{
							for (int j=-1; j<=1; j++) 
							{
								if(i == 0 || j == 0) 
								{
									if(p.x+i>=0 && p.x+i<grads.Columns() && p.y+j>=0 && p.y+j<grads.Rows()) 
									{
										if(dummy(p.y+j,p.x+i) == 0 && thick(p.y+j,p.x+i) == 0)
										{
											tmpQ.push(Point(p.x+i,p.y+j));
											dummy(p.y+j,p.x+i) = 1;
											labels(p.y+j,p.x+i) = label;
											LabelCount(label)++;
											LabelAvg(label) += grads(p.y+j,p.x+i);
										}
									}
								}
							}
						}
					}

				}
				else if(thick(y,x) == 1)
				{
					outsQ.push(Point(x,y));
				}
			}
		}


		for(int i=1;i<=label;i++)
		{
			LabelAvg(i) /= LabelCount(i);
			//					Console.WriteLine(i + ": " + LabelCount[i] + " : " + LabelAvg[i]);
		}
		




		// Utilize suppressed edges and use sorting for gradients...
		// Region growing here...

		CompareGrads::gradMatrix = grads;


		Matrix<int> tmp(grads.Rows(), grads.Columns(), 0);
		//Hashtable Marked = new Hashtable();
		bool greedy = false;
		int counter = 0;
		while(outsQ.size() > 0)
		{
			counter++;
			//Marked.Clear();
			int len = outsQ.size();
			//cout << "Length: " << len << endl;

			// copy queue to a list
			vector<Point> psA;
			for(int i=0; i<len; i++)
			{
				psA.push_back(outsQ.front());
				outsQ.pop();
			}
			std::sort( psA.begin( ), psA.end( ), CompareGrads::Compare );

			int marked = 0;
			for(int i=0; i<psA.size(); i++)
			{
				Point p = psA[i];
				if(labels(p.y,p.x) == 0)
				{
					vector<Point> A;


					for (int i=-1; i<=1; i++) 
					{
						for (int j=-1; j<=1; j++) 
						{
							if(i == 0 || j == 0) 
							{
								if(p.x+i>=0 && p.x+i<grads.Columns() && p.y+j>=0 && p.y+j<grads.Rows()) 
								{
									if(labels(p.y+j,p.x+i) != 0)
									{
										A.push_back(Point(p.x+i,p.y+j));
									}
								}
							}
						}
					}

					if(A.size() == 0)
					{
						outsQ.push(p);
					}
					else if(A.size() == 1)
					{
						Point p2 = A[0];
						if(suppressed(p.y,p.x) == 0 || greedy)
						{
							labels(p.y,p.x) = labels(p2.y,p2.x);
							marked++;
						}
						else
						{
							outsQ.push(p);
						}
					}
					else
					{
						Point pp = A[0];
						bool equal = true;
						for(int j=0;j<A.size();j++)
						{
							Point pp2 = A[j];
							if(labels(pp.y,pp.x) != labels(pp2.y,pp2.x))
							{
								equal = false;
							}
						}

						if(equal)
						{
							if(suppressed(p.y,p.x) == 0 || greedy)
							{
								labels(p.y,p.x) = labels(pp.y,pp.x);
								marked++;
							}
							else
							{
								outsQ.push(p);
							}
						}
					}
				}
				else
				{
					cout << "Something is wrong: A labeled point is added to the Queue!!!" << endl;
				}
			}


			if(marked == 0 && greedy)
			{
				break;
			}

			if(marked == 0)
			{
				greedy = true;
			}
		}
		






		for (int x=0; x<grads.Columns(); x++) 
		{
			for (int y=0; y<grads.Rows(); y++) 
			{
				if(labels(y,x) == 0)
				{
					edges(y,x) = 1;
				}
			}
		}

		cout << "Extracting boundaries finished!" << endl;

		return edges;


	
	
	}


	float Angle(float x1, float y1, float x2,  float y2)
	{
		float scalar = x1*x2+y1*y2;
		float m1 = sqrt(x1*x1+y1*y1);
		float m2 = sqrt(x2*x2+y2*y2);
		float ac = scalar/(m1*m2);
		ac = ac>1?1:ac;
		ac = ac<-1?-1:ac;
		return acos(ac)*180/PI;
	}


//The following code for RGB to Lab conversion is adapted from code 
//written by Yossi Rubner and Mark Ruzon. Following comments belong to them.
//Baris Sumengen 09/09/2005
//
//	Convert between RGB and CIE-Lab color spaces
//	Uses ITU-R recommendation BT.709 with D65 as reference white.
//	Yossi Rubner 2/24/98
//
//	Mark Ruzon 3/18/99 -- Added thresholds to truncate parts of the space
//	where changing a value has no visible effect on the color.


	void RGB2Lab(double R, double G, double B, double &L, double &a, double &b)
	{
		const double BLACK = 20;
		const double YELLOW = 70;
		double X, Y, Z, fX, fY, fZ;

		X = 0.412453*R + 0.357580*G + 0.180423*B;
		Y = 0.212671*R + 0.715160*G + 0.072169*B;
		Z = 0.019334*R + 0.119193*G + 0.950227*B;

		X /= (255 * 0.950456);
		Y /=  255;
		Z /= (255 * 1.088754);

		if(Y > 0.008856)
		{
			fY = pow(Y, 1.0/3.0);
			L = 116.0*fY - 16.0;
		}
		else
		{
			fY = 7.787*Y + 16.0/116.0;
			L = 903.3*Y;
		}

		if(X > 0.008856)
		{
			fX = pow(X, 1.0/3.0);
		}
		else
		{
			fX = 7.787*X + 16.0/116.0;
		}

		if(Z > 0.008856)
		{
			fZ = pow(Z, 1.0/3.0);
		}
		else
		{
			fZ = 7.787*Z + 16.0/116.0;
		}

		a = 500.0*(fX - fY);
		b = 200.0*(fY - fZ);

		if(L < BLACK) 
		{
			a *= exp((L - BLACK) / (BLACK / 4));
			b *= exp((L - BLACK) / (BLACK / 4));
			L = BLACK;
		}
		if(b > YELLOW)
		{
			b = YELLOW;
		}
	}


	void Lab2RGB(double L, double a, double b, double &R, double &G, double &B)
	{
		const double BLACK = 20;
		const double YELLOW = 70;
		double X, Y, Z, fX, fY, fZ;
		double RR, GG, BB;

		fY = pow((L + 16.0) / 116.0, 3.0);
		if(fY < 0.008856)
		{
			fY = L / 903.3;
		}
		Y = fY;

		if(fY > 0.008856)
		{
			fY = pow(fY, 1.0/3.0);
		}
		else
		{
			fY = 7.787 * fY + 16.0/116.0;
		}

		fX = a / 500.0 + fY;      
		if(fX > 0.206893)
		{
			X = pow(fX, 3.0);
		}
		else
		{
			X = (fX - 16.0/116.0) / 7.787;
		}

		fZ = fY - b /200.0;      
		if(fZ > 0.206893)
		{
			Z = pow(fZ, 3.0);
		}
		else
		{
			Z = (fZ - 16.0/116.0) / 7.787;
		}

		X *= (0.950456 * 255);
		Y *=             255;
		Z *= (1.088754 * 255);

		RR =  3.240479*X - 1.537150*Y - 0.498535*Z;
		GG = -0.969256*X + 1.875992*Y + 0.041556*Z;
		BB =  0.055648*X - 0.204043*Y + 1.057311*Z;

		R = (double)(RR < 0 ? 0 : RR > 255 ? 255 : RR);
		G = (double)(GG < 0 ? 0 : GG > 255 ? 255 : GG);
		B = (double)(BB < 0 ? 0 : BB > 255 ? 255 : BB);

	}


	MatrixList<float> RGB2Lab(MatrixList<float> input)
	{
		if(input.Planes() != 3)
		{
			cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
			Utility::RunTimeError("Length of MatrixList should be 3 for an RGB image!");
		}
		MatrixList<float> tmp(3, input.Rows(),input.Columns());
		for(int i=0;i<input.Rows();i++)
		{
			for(int j=0;j<input.Columns();j++)
			{
				double L,a,b;
				L = a = b = 0;
				RGB2Lab(input[0].ElemNC(i,j),input[1].ElemNC(i,j),input[2].ElemNC(i,j), L, a, b);
				tmp[0].ElemNC(i,j) = (float)L;
				tmp[1].ElemNC(i,j) = (float)a;
				tmp[2].ElemNC(i,j) = (float)b;
			}
		}
		return tmp;

	}


	MatrixList<float> Lab2RGB(MatrixList<float> input)
	{
		if(input.Planes() != 3)
		{
			cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
			Utility::RunTimeError("Length of MatrixList should be 3 for an Lab image!");
		}
		MatrixList<float> tmp(3, input.Rows(),input.Columns());
		for(int i=0;i<input.Rows();i++)
		{
			for(int j=0;j<input.Columns();j++)
			{
				double R,G,B;
				R = G = B = 0;
				Lab2RGB(input[0].ElemNC(i,j),input[1].ElemNC(i,j),input[2].ElemNC(i,j), R, G, B);
				tmp[0].ElemNC(i,j) = (float)R;
				tmp[1].ElemNC(i,j) = (float)G;
				tmp[2].ElemNC(i,j) = (float)B;
			}
		}
		return tmp;

	}


	extern "C" float *poisson(float *tmp, int X_DIM, int Y_DIM);

	Matrix<int> SegmentEF(Matrix<float> &im, bool normalized, float initScale, float scaleJump, 
		float endScale, float angleLimit, float ratioLimit, float smoothWeighting, float stopError, int accuracy)
	{
		float diag = sqrt(float(im.Rows()*im.Rows() + im.Columns()*im.Columns()));
		float atomic = diag/1000.0;
		cout << "Unit scale: " << atomic << " pixels" << endl << endl;
		float scale = initScale*atomic;

		cout << "Flow field at scale: " << scale << endl;
		MatrixList<float> flow = EdgeflowVectorField(im, 8, scale, scale, 1.0f, normalized);
		endScale = endScale*atomic;
		scaleJump = scaleJump*atomic;
		scale += scaleJump;
		while( scale <=  endScale)
		{
			Matrix<float> efMag = Sqrt(flow(0)*flow(0)+flow(1)*flow(1));
			float magLimit = Maximum(efMag(":"))/ratioLimit;

			cout << "Flow field at scale: " << scale << " pixels" << endl;
			MatrixList<float> tempflow = EdgeflowVectorField(im, 4, scale, scale, 1.0f, normalized);
			Matrix<float> tempMag = Sqrt(tempflow(0)*tempflow(0)+tempflow(1)*tempflow(1));

			for (int i=0; i<flow.Rows(); i++) {
				for (int j=0; j<flow.Columns(); j++) {
					if(efMag(i,j) < magLimit)
					{
						flow(0)(i,j) = tempflow(0)(i,j);
						flow(1)(i,j) = tempflow(1)(i,j);
					}
					else if( Angle(flow(0)(i,j),flow(1)(i,j),tempflow(0)(i,j),tempflow(1)(i,j)) < angleLimit )
					{
						flow(0)(i,j) += tempflow(0)(i,j);
						flow(1)(i,j) += tempflow(1)(i,j);
					}
				}
			}
			scale += scaleJump;
		}


		Matrix<float> BB = Divergence(flow(0), flow(1));
		float *tmp = poisson((-BB).Data(), BB.Columns(), BB.Rows());
		Matrix<float> CC(BB.Rows(), BB.Columns());
		for (int j=0; j<CC.Rows(); j++) {
			for (int i=0; i<CC.Columns(); i++) {
				CC(j,i) = tmp[i+j*CC.Columns()];
			}
		}
		ImWrite(CC, "edgefunction.png");
		float min = Minimum(CC(":"));
		float max = Maximum(CC(":"));
		CC -= min;
		CC *= 2.0f/(max-min);
		flow(0) *= 40.0f/(max-min);
		flow(1) *= 40.0f/(max-min);

		Matrix<float> b(im.Rows()+6, im.Columns()+6,0);
		b(3,im.Rows()+2,3,im.Columns()+2) = smoothWeighting*CC;

		Matrix<float> u(im.Rows()+6, im.Columns()+6,0);
		u(3,im.Rows()+2,3,im.Columns()+2) = flow(0);

		Matrix<float> v(im.Rows()+6, im.Columns()+6,0);
		v(3,im.Rows()+2,3,im.Columns()+2) = flow(1);

		Matrix<float> phi(im.Rows()+6, im.Columns()+6);
		phi(3,im.Rows()+2,3,im.Columns()+2) = im;

		Matrix<float> delta(im.Rows()+6, im.Columns()+6);
		Matrix<float> delta2(im.Rows()+6, im.Columns()+6);
		Matrix<float> old = im.Clone();

		PerfTimer pt200;
		pt200.Tic();
		float oldChange = 1e10;
		int k=0;
		while(1)
		{
			ExtendConst2D(phi,3);
			Evolve2DKappa(phi, 1, 1, 1, 1, b, delta);
			switch( accuracy )
			{
				case 1:
					Evolve2DVectorENO1(phi, 1, 1, u, v, delta2);
					break;
				case 2:
					Evolve2DVectorENO2(phi, 1, 1, u, v, delta2);
					break;
				case 3:
					Evolve2DVectorENO3(phi, 1, 1, u, v, delta2);
					break;
				case 5:
					Evolve2DVectorWENO(phi, 1, 1, u, v, delta2);
					break;
				default:
					cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
					Utility::RunTimeError("accuracy parameter can only be 1, 2, 3, or 5!");
			}

			float dt = Getdt2DVectorKappa(0.95f, 1, 1, 1, 1, u, v, b);
			AddPhi2D(phi,delta,dt);
			SubtractPhi2D(phi,delta2,dt);
			if(k%200 == 199 ){
				cout << "EF: " << k+1 << endl;
				pt200.Toc();
				char str[100];
				sprintf(str, "phi_%03d.bmp", k);
				for(int i=0; i<phi.Numel(); i++)
				{
					if(phi(i) < 0)
					{
						phi(i) = 0;
					}
					if(phi(i) > 255)
					{
						phi(i) = 255;
					}
				}
				Matrix<float> diffused = phi.Slice(3,im.Rows()+2,3,im.Columns()+2);
				//	ImWrite(diffused, str);
				float change = Sum(Vector<float>(Abs(old-diffused)))/im.Numel();
				cout << "Error: "  << change << endl << endl;
				if(change < stopError || k > 10000)
				{
					break;
				}
				if(change > oldChange)
				{

					Utility::Warning("!!!!! Instaability detected during diffusion... Exiting diffusion stage!");
					break;
				}
				oldChange = change;
				old = diffused.Clone();
				pt200.Tic();
			}
			k++;
		}

		phi = phi.Slice(3,im.Rows()+2,3,im.Columns()+2);
		for(int i=0; i<phi.Numel(); i++)
		{
			if(phi(i) < 0)
			{
				phi(i) = 0;
			}
			if(phi(i) > 255)
			{
				phi(i) = 255;
			}
		}

		ImWrite(phi, "diffused.png");

		Matrix<float> gx = FilterFDGaussian2D(phi, atomic, 0);
		Matrix<float> gy = FilterFDGaussian2D(phi, atomic, 90);
		Matrix<float> gradIm = Sqrt(SQR(gx) + SQR(gy));
		Matrix<float> gradSupp = NonMaximaSuppress(gradIm, gx, gy);
		Matrix<int> edges = GetEgdes(gradIm, gradIm >

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产色综合久久不卡电影 | 欧美日韩亚洲综合一区| 欧美一区二区久久| 最新不卡av在线| 狠狠色伊人亚洲综合成人| 欧洲精品视频在线观看| 国产日韩欧美综合一区| 石原莉奈在线亚洲三区| 99re热这里只有精品视频| 亚洲精品一区在线观看| 日韩国产精品大片| 在线观看视频91| 国产精品三级av| 黑人巨大精品欧美一区| 欧美日韩你懂的| 一区二区不卡在线播放| 99久久99精品久久久久久| 久久久久久一二三区| 日本美女一区二区三区视频| 欧美亚洲一区二区在线| 国产精品初高中害羞小美女文| 麻豆一区二区三区| 在线播放中文字幕一区| 亚洲国产色一区| 欧美伊人精品成人久久综合97| 亚洲天堂免费在线观看视频| 成人激情黄色小说| 中文在线一区二区 | 日韩精品影音先锋| 亚洲午夜久久久久久久久电影网| 91香蕉视频黄| 亚洲视频你懂的| 色综合久久久久| 亚洲人成影院在线观看| 色综合 综合色| 亚洲自拍另类综合| 欧美日韩一卡二卡| 日韩黄色免费电影| 日韩久久久精品| 国产一区中文字幕| 久久久久9999亚洲精品| 国产成人免费视频网站高清观看视频| 精品卡一卡二卡三卡四在线| 韩国中文字幕2020精品| 欧美国产成人精品| 91亚洲精品乱码久久久久久蜜桃| 亚洲欧美韩国综合色| 欧美色中文字幕| 蜜桃在线一区二区三区| 欧美成人a视频| 国产成人亚洲综合a∨婷婷| 亚洲国产成人午夜在线一区| 99re66热这里只有精品3直播| 亚洲精品水蜜桃| 欧美日韩国产综合草草| 韩国成人精品a∨在线观看| 国产欧美一区二区精品久导航| 成人黄色国产精品网站大全在线免费观看| 国产精品久久毛片av大全日韩| 91欧美一区二区| 日本视频一区二区三区| 久久精品一区二区三区四区| 99精品久久只有精品| 丝袜亚洲精品中文字幕一区| 久久综合久久鬼色| 色婷婷亚洲一区二区三区| 日韩精品一级中文字幕精品视频免费观看| 欧美岛国在线观看| 91啪在线观看| 韩国女主播一区| 亚洲一级二级三级在线免费观看| 日韩欧美第一区| 色综合婷婷久久| 91片黄在线观看| 免费观看在线综合| ●精品国产综合乱码久久久久| 欧美一区午夜精品| 91在线看国产| 国产精品一线二线三线| 亚洲成av人片一区二区梦乃| 欧美激情在线观看视频免费| 欧美伦理电影网| av福利精品导航| 精品一区二区三区免费观看| 亚洲美女屁股眼交3| 久久久久99精品国产片| 欧美一区二区私人影院日本| 91免费视频观看| 国产成人综合自拍| 免费成人美女在线观看.| 亚洲精品中文在线| 中文一区一区三区高中清不卡| 欧美一区二区三区电影| 欧美亚洲精品一区| 色综合久久综合网97色综合 | 一区二区三区日韩欧美| 国产三级三级三级精品8ⅰ区| 这里只有精品免费| 欧美三片在线视频观看 | 国产电影一区二区三区| 日韩高清中文字幕一区| 亚洲一区中文在线| 亚洲免费在线电影| 亚洲天堂av老司机| 中文字幕一区在线| 中文字幕av不卡| 丝袜a∨在线一区二区三区不卡| 中文在线一区二区| 国产欧美一区视频| 国产亚洲一本大道中文在线| 精品国产乱码久久久久久蜜臀| 欧美精品精品一区| 欧美一区中文字幕| 欧美mv日韩mv国产网站app| 日韩亚洲欧美高清| 日韩女优av电影在线观看| 日韩欧美国产三级| 久久亚洲欧美国产精品乐播| 精品久久国产老人久久综合| 日韩精品中午字幕| 精品国产乱码久久久久久久久 | 喷水一区二区三区| 青草国产精品久久久久久| 日本va欧美va欧美va精品| 日韩精品一二区| 久久99精品一区二区三区| 久久99日本精品| 国产高清久久久| 成人涩涩免费视频| 色就色 综合激情| 欧美在线观看视频在线| 欧美日韩精品福利| 日韩欧美成人激情| 久久久久9999亚洲精品| 国产精品亲子乱子伦xxxx裸| 日韩美女视频一区二区| 亚洲一区二区三区视频在线播放| 婷婷夜色潮精品综合在线| 免费在线观看精品| 国产精品伊人色| 色94色欧美sute亚洲13| 国产精品乱人伦| 亚洲乱码中文字幕| 日韩国产高清影视| 成人夜色视频网站在线观看| 色悠久久久久综合欧美99| 777色狠狠一区二区三区| 精品国产91乱码一区二区三区| 国产精品福利一区二区三区| 亚洲成人精品在线观看| 国产精品影音先锋| 日本久久一区二区| 欧美精品一区二区三区高清aⅴ | 日韩一区二区在线观看视频 | 中文字幕免费在线观看视频一区| 亚洲精品亚洲人成人网| 蜜臀久久99精品久久久久宅男| 国产成人精品在线看| 欧美三级日韩在线| 中文字幕+乱码+中文字幕一区| 图片区小说区区亚洲影院| 国产成人av影院| 欧美精品免费视频| 国产精品三级久久久久三级| 青青草国产成人99久久| 91麻豆免费视频| 久久久亚洲高清| 视频一区二区中文字幕| 成人黄色软件下载| 精品91自产拍在线观看一区| 亚洲与欧洲av电影| 不卡av在线免费观看| 日韩视频一区二区在线观看| 亚洲精品国产精品乱码不99| 国产精品一线二线三线| 日韩一区二区在线观看视频播放| 亚洲色图在线播放| 国产一区二区三区高清播放| 777色狠狠一区二区三区| 亚洲精品国产精华液| a4yy欧美一区二区三区| 精品sm在线观看| 蜜臀av一区二区在线免费观看| 中日韩免费视频中文字幕| 日韩av午夜在线观看| 色噜噜狠狠成人网p站| 一区免费观看视频| 成人国产视频在线观看| 久久久久久**毛片大全| 秋霞午夜av一区二区三区| 欧美中文字幕亚洲一区二区va在线 | 樱花影视一区二区| 成+人+亚洲+综合天堂| 国产三级一区二区| 国产乱子伦视频一区二区三区 | 99精品1区2区| 中文字幕av不卡| 成人免费观看视频| 国产精品无人区| 99久久精品免费观看|