⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 levelsetmethods.h

📁 图像分割算法
💻 H
字号:
//Copyright (c) 2004-2005, Baris Sumengen
//All rights reserved.
//
// CIMPL Matrix Performance Library
//
//Redistribution and use in source and binary
//forms, with or without modification, are
//permitted provided that the following
//conditions are met:
//
//    * No commercial use is allowed. 
//    This software can only be used
//    for non-commercial purposes. This 
//    distribution is mainly intended for
//    academic research and teaching.
//    * Redistributions of source code must
//    retain the above copyright notice, this
//    list of conditions and the following
//    disclaimer.
//    * Redistributions of binary form must
//    mention the above copyright notice, this
//    list of conditions and the following
//    disclaimer in a clearly visible part 
//    in associated product manual, 
//    readme, and web site of the redistributed 
//    software.
//    * Redistributions in binary form must
//    reproduce the above copyright notice,
//    this list of conditions and the
//    following disclaimer in the
//    documentation and/or other materials
//    provided with the distribution.
//    * The name of Baris Sumengen may not be
//    used to endorse or promote products
//    derived from this software without
//    specific prior written permission.
//
//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
//HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
//EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
//NOT LIMITED TO, THE IMPLIED WARRANTIES OF
//MERCHANTABILITY AND FITNESS FOR A PARTICULAR
//PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
//CONTRIBUTORS BE LIABLE FOR ANY
//DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
//EXEMPLARY, OR CONSEQUENTIAL DAMAGES
//(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
//OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
//DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
//HOWEVER CAUSED AND ON ANY THEORY OF
//LIABILITY, WHETHER IN CONTRACT, STRICT
//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
//OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
//OF THIS SOFTWARE, EVEN IF ADVISED OF THE
//POSSIBILITY OF SUCH DAMAGE.


#pragma once
#ifndef LEVELSETMETHODS_H
#define LEVELSETMETHODS_H

#include <cmath>

#include "cimpl.h"
using namespace CIMPL;

#include "Core.h"
#include "Functions.h"
using namespace MathCore;


namespace LevelSetMethods
{

	Matrix<int> ExtractCurve(Matrix<float> phi);
	Matrix<int> ExtractCurve(Matrix<double> phi);

	Matrix<float>& ExtendConst2D(Matrix<float>& phi, int size);
	Matrix<float>& Extend2D(Matrix<float>& phi, int size);
	Matrix<double>& Extend2D(Matrix<double>& phi, int size);

	void Evolve2DNormalENO1(Matrix<float>& phi, float dx, float dy, Matrix<float>& Vn, Matrix<float>& delta, Matrix<float>& H1Abs, Matrix<float>& H2Abs);
	void Evolve2DNormalENO2(Matrix<float>& phi, float dx, float dy, Matrix<float>& Vn, Matrix<float>& delta, Matrix<float>& H1Abs, Matrix<float>& H2Abs);
	void Evolve2DNormalENO3(Matrix<float>& phi, float dx, float dy, Matrix<float>& Vn, Matrix<float>& delta, Matrix<float>& H1Abs, Matrix<float>& H2Abs);
	void Evolve2DNormalWENO(Matrix<float>& phi, float dx, float dy, Matrix<float>& Vn, Matrix<float>& delta, Matrix<float>& H1Abs, Matrix<float>& H2Abs);

	void Evolve2DNormalENO1(Matrix<double>& phi, double dx, double dy, Matrix<double>& Vn, Matrix<double>& delta, Matrix<double>& H1Abs, Matrix<double>& H2Abs);
	void Evolve2DNormalENO2(Matrix<double>& phi, double dx, double dy, Matrix<double>& Vn, Matrix<double>& delta, Matrix<double>& H1Abs, Matrix<double>& H2Abs);
	void Evolve2DNormalENO3(Matrix<double>& phi, double dx, double dy, Matrix<double>& Vn, Matrix<double>& delta, Matrix<double>& H1Abs, Matrix<double>& H2Abs);
	void Evolve2DNormalWENO(Matrix<double>& phi, double dx, double dy, Matrix<double>& Vn, Matrix<double>& delta, Matrix<double>& H1Abs, Matrix<double>& H2Abs);

	
	void Evolve2DVectorENO1(Matrix<float>& phi, float dx, float dy, Matrix<float>& u, Matrix<float>& v, Matrix<float>& delta);
	void Evolve2DVectorENO2(Matrix<float>& phi, float dx, float dy, Matrix<float>& u, Matrix<float>& v, Matrix<float>& delta);
	void Evolve2DVectorENO3(Matrix<float>& phi, float dx, float dy, Matrix<float>& u, Matrix<float>& v, Matrix<float>& delta);
	void Evolve2DVectorWENO(Matrix<float>& phi, float dx, float dy, Matrix<float>& u, Matrix<float>& v, Matrix<float>& delta);

	void Evolve2DVectorENO1(Matrix<double>& phi, double dx, double dy, Matrix<double>& u, Matrix<double>& v, Matrix<double>& delta);
	void Evolve2DVectorENO2(Matrix<double>& phi, double dx, double dy, Matrix<double>& u, Matrix<double>& v, Matrix<double>& delta);
	void Evolve2DVectorENO3(Matrix<double>& phi, double dx, double dy, Matrix<double>& u, Matrix<double>& v, Matrix<double>& delta);
	void Evolve2DVectorWENO(Matrix<double>& phi, double dx, double dy, Matrix<double>& u, Matrix<double>& v, Matrix<double>& delta);


	void Evolve2DNormalVectorENO1SignedDistance(Matrix<float>& phi, float dx, float dy, Matrix<float>& u, Matrix<float>& v, Matrix<float>& Vn, Matrix<float>& delta, Matrix<float>& H1Abs, Matrix<float>& H2Abs);
	void Evolve2DNormalVectorENO2SignedDistance(Matrix<float>& phi, float dx, float dy, Matrix<float>& u, Matrix<float>& v, Matrix<float>& Vn, Matrix<float>& delta, Matrix<float>& H1Abs, Matrix<float>& H2Abs);
	void Evolve2DNormalVectorENO3SignedDistance(Matrix<float>& phi, float dx, float dy, Matrix<float>& u, Matrix<float>& v, Matrix<float>& Vn, Matrix<float>& delta, Matrix<float>& H1Abs, Matrix<float>& H2Abs);
	void Evolve2DNormalVectorWENOSignedDistance(Matrix<float>& phi, float dx, float dy, Matrix<float>& u, Matrix<float>& v, Matrix<float>& Vn, Matrix<float>& delta, Matrix<float>& H1Abs, Matrix<float>& H2Abs);

	void Evolve2DNormalVectorENO1SignedDistance(Matrix<double>& phi, double dx, double dy, Matrix<double>& u, Matrix<double>& v, Matrix<double>& Vn, Matrix<double>& delta, Matrix<double>& H1Abs, Matrix<double>& H2Abs);
	void Evolve2DNormalVectorENO2SignedDistance(Matrix<double>& phi, double dx, double dy, Matrix<double>& u, Matrix<double>& v, Matrix<double>& Vn, Matrix<double>& delta, Matrix<double>& H1Abs, Matrix<double>& H2Abs);
	void Evolve2DNormalVectorENO3SignedDistance(Matrix<double>& phi, double dx, double dy, Matrix<double>& u, Matrix<double>& v, Matrix<double>& Vn, Matrix<double>& delta, Matrix<double>& H1Abs, Matrix<double>& H2Abs);
	void Evolve2DNormalVectorWENOSignedDistance(Matrix<double>& phi, double dx, double dy, Matrix<double>& u, Matrix<double>& v, Matrix<double>& Vn, Matrix<double>& delta, Matrix<double>& H1Abs, Matrix<double>& H2Abs);


	void Evolve2DKappa(Matrix<float>& phi, float dx, float dy, float dx2, float dy2, Matrix<float>& b, Matrix<float>& delta);
	void Evolve2DKappa(Matrix<double>& phi, double dx, double dy, double dx2, double dy2, Matrix<double>& b, Matrix<double>& delta);


	float Getdt2DNormal(float alpha, float dx, float dy, Matrix<float>& H1Abs, Matrix<float>& H2Abs);
	float Getdt2DNormalVector(float alpha, float dx, float dy, Matrix<float>& H1Abs, Matrix<float>& H2Abs);
	float Getdt2DVector(float alpha, float dx, float dy, Matrix<float>& u, Matrix<float>& v);
	float Getdt2DKappa(float alpha, float dx2, float dy2, Matrix<float>& b);
	float Getdt2DVectorKappa(float alpha, float dx, float dy, float dx2, float dy2, Matrix<float>& u, Matrix<float>& v, Matrix<float>& b);
	float Getdt2DNormalKappa(float alpha, float dx, float dy, float dx2, float dy2, Matrix<float>& H1Abs, Matrix<float>& H2Abs, Matrix<float>& b);
	float Getdt2DNormalVectorKappa(float alpha, float dx, float dy, float dx2, float dy2, Matrix<float>& H1Abs, Matrix<float>& H2Abs, Matrix<float>& b);

	double Getdt2DNormal(double alpha, double dx, double dy, Matrix<double>& H1Abs, Matrix<double>& H2Abs);
	double Getdt2DNormalVector(double alpha, double dx, double dy, Matrix<double>& H1Abs, Matrix<double>& H2Abs);
	double Getdt2DVector(double alpha, double dx, double dy, Matrix<double>& u, Matrix<double>& v);
	double Getdt2DKappa(double alpha, double dx2, double dy2, Matrix<double>& b);
	double Getdt2DVectorKappa(double alpha, double dx, double dy, double dx2, double dy2, Matrix<double>& u, Matrix<double>& v, Matrix<double>& b);
	double Getdt2DNormalKappa(double alpha, double dx, double dy, double dx2, double dy2, Matrix<double>& H1Abs, Matrix<double>& H2Abs, Matrix<double>& b);
	double Getdt2DNormalVectorKappa(double alpha, double dx, double dy, double dx2, double dy2, Matrix<double>& H1Abs, Matrix<double>& H2Abs, Matrix<double>& b);



	void SubtractPhi2D(Matrix<float>& phi, Matrix<float>& delta, float dt);
	void AddPhi2D(Matrix<float>& phi, Matrix<float>& delta, float dt);

	void SubtractPhi2D(Matrix<double>& phi, Matrix<double>& delta, double dt);
	void AddPhi2D(Matrix<double>& phi, Matrix<double>& delta, double dt);



	float KappaAbsPhi2D(float phi_i_j, float phi_ip1_j, float phi_ip1_jp1, 
		float phi_i_jp1, float phi_im1_jp1, float phi_im1_j, float phi_im1_jm1, 
		float phi_i_jm1, float phi_ip1_jm1, float dx, float dy, float dx2, float dy2);

	double KappaAbsPhi2D(double phi_i_j, double phi_ip1_j, double phi_ip1_jp1, 
		double phi_i_jp1, double phi_im1_jp1, double phi_im1_j, double phi_im1_jm1, 
		double phi_i_jm1, double phi_ip1_jm1, double dx, double dy, double dx2, double dy2);

	
	void ReinitSignedDistanceENO1(Matrix<float>& phi, float dx, float dy, float alpha, int iterations);
	void ReinitSignedDistanceENO2(Matrix<float>& phi, float dx, float dy, float alpha, int iterations);
	void ReinitSignedDistanceENO3(Matrix<float>& phi, float dx, float dy, float alpha, int iterations);
	void ReinitSignedDistanceWENO(Matrix<float>& phi, float dx, float dy, float alpha, int iterations);

	void ReinitSignedDistanceENO1(Matrix<double>& phi, double dx, double dy, double alpha, int iterations);
	void ReinitSignedDistanceENO2(Matrix<double>& phi, double dx, double dy, double alpha, int iterations);
	void ReinitSignedDistanceENO3(Matrix<double>& phi, double dx, double dy, double alpha, int iterations);
	void ReinitSignedDistanceWENO(Matrix<double>& phi, double dx, double dy, double alpha, int iterations);



	float SelectDerNormal(float phi_x_m, float phi_x_p, float Vn);
	float SelectDerNormalVectorSD(float phi_x_m, float phi_x_p, float u, float Vn);

	double SelectDerNormal(double phi_x_m, double phi_x_p, double Vn);
	double SelectDerNormalVectorSD(double phi_x_m, double phi_x_p, double u, double Vn);


	float DerENO1Minus(float v1, float v2, float dx);
	float DerENO1Plus(float v1, float v2, float dx);
	float DerENO2Minus(float v1, float v2, float v3, float v4, float dx);
	float DerENO2Plus(float v1, float v2, float v3, float v4, float dx);
	float DerENO3Minus(float v1, float v2, float v3, float v4, float v5, float v6, float dx);
	float DerENO3Plus(float v1, float v2, float v3, float v4, float v5, float v6, float dx);
	float DerWENOMinus(float v1, float v2, float v3, float v4, float v5, float v6, float dx);
	float DerWENOPlus(float v1, float v2, float v3, float v4, float v5, float v6, float dx);

	double DerENO1Minus(double v1, double v2, double dx);
	double DerENO1Plus(double v1, double v2, double dx);
	double DerENO2Minus(double v1, double v2, double v3, double v4, double dx);
	double DerENO2Plus(double v1, double v2, double v3, double v4, double dx);
	double DerENO3Minus(double v1, double v2, double v3, double v4, double v5, double v6, double dx);
	double DerENO3Plus(double v1, double v2, double v3, double v4, double v5, double v6, double dx);
	double DerWENOMinus(double v1, double v2, double v3, double v4, double v5, double v6, double dx);
	double DerWENOPlus(double v1, double v2, double v3, double v4, double v5, double v6, double dx);


	//inline int Sign(float f)
	//{
	//	if(f>0)
	//	{
	//		return 1;
	//	}
	//	else if(f < 0)
	//	{
	//		return -1;
	//	}
	//	else
	//	{
	//		return 0;
	//	}
	//}

	











#include "./LevelSetMethods.inl"

}; //namespace



#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -