using OpenCvSharp;
using PaintDotNet.Base.DedicatedAnalysis.Porosity.Model;
using System.Collections.Generic;
using System.Drawing;
namespace PaintDotNet.Base.DedicatedAnalysis.Porosity
{
///
/// 孔隙标准
///
public abstract class PorositysStandard
{
public static Color[] RAINBOW_COLORS = { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Cyan, Color.Purple };
///
/// 设置
///
public PorositysGlobalSettings globalSettings = new PorositysGlobalSettings();
#region 识别测量区域中的微粒
///
/// 识别测量区域中的微粒
///
/// 视场
/// 识别出的微粒列表
public virtual List identifyParticles(Mat field)
{
Cv2.Threshold(field, field, 175, 255, ThresholdTypes.BinaryInv);
OpenCvSharp.Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(field, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
List particles = new List();
for (int i = 0; i < contours.Length; i++)
{
if (hierarchy[i].Parent != -1)
{
continue;
}
OpenCvSharp.Point[] contour = contours[i];
particles.Add(new Particle(contour, this));
}
return particles;
}
#endregion
#region 划分孔隙
///
/// 划分孔隙
///
/// 使用distancesBetweenParticles,distancesBetweenStringers划分孔隙
/// 过滤后的微粒列表
/// 孔隙列表
public virtual List divideInclusion(List particles)
{
return this.particlesDividePorosity(particles);
}
#endregion
#region 过滤微粒
///
/// 过滤微粒
///
/// 使用minimumLength,minimumWidth最小尺寸来过滤微粒
/// 过滤前的微粒列表
/// 过滤后的微粒列表
public virtual List filterParticles(List particles)
{
for (int i = particles.Count - 1; i >= 0; i--)
{
Particle particle = particles[i];
if (particle.physicalLength < this.globalSettings.minimumLength ||
particle.physicalWidth < this.globalSettings.minimumWidth)
{
particles.Remove(particle);
}
}
return particles;
}
#endregion
#region 微粒划分孔隙
///
/// 微粒划分孔隙
///
/// 过滤后的微粒列表
/// 孔隙列表
protected virtual List particlesDividePorosity(List particles)
{
List Porositys = new List();
// 第一次划分 微粒划分孔隙
foreach (Particle particle in particles)
{
if (Porositys.Count == 0)
{
Porositys Porosity = new Porositys(this);
Porosity.addParticles(particle);
Porositys.Add(Porosity);
continue;
}
Porositys newPorosity = new Porositys(this);
newPorosity.addParticles(particle);
Porositys.Add(newPorosity);
}
return Porositys;
}
#endregion
///
/// 判断孔隙类型
///
public abstract void determineType(Porositys Porosity);
///
/// 边缘误差修正
///
/// 根据视场边界修正所计算的孔隙
///
public abstract void edgeErrorsCorrection(List Porositys);
}
}