public static ICandidatePixelFilter CreateHighTmpXPercentFilter(IArgumentProvider argProvider, IContextMessage contextMessage) { float percent = Obj2Float(argProvider.GetArg("HTPixelPercent")); if (percent < float.Epsilon) { PrintInfo(contextMessage, " x% 高温像元(中红外通道)参数设置错误。"); return(null); } percent /= 100f; IBandNameRaster bandNameRaster = argProvider.DataProvider as IBandNameRaster; int bandNo = TryGetBandNo(argProvider, bandNameRaster, "MiddleInfrared"); if (bandNo < 1) { PrintInfo(contextMessage, " 获取中红外波段序号失败。"); return(null); } ICandidatePixelFilter filter = PercentPixelFilterFactory.GetFilter(argProvider.DataProvider.DataType, bandNo, percent, false); if (filter == null) { PrintInfo(contextMessage, " 获取x% 高温像元(中红外通道)候选像元过滤器失败。"); return(null); } filter.Name = " 获取x% 高温像元(中红外通道)作为候选像元"; return(filter); }
private void DoFilters(IArgumentProvider argProvider, out Dictionary <int, PixelFeature> features, Action <int, string> progressTracker) { features = null; ICandidatePixelFilter filter = null; int[] aoi = argProvider.AOI; Size size = new Size(argProvider.DataProvider.Width, argProvider.DataProvider.Height); Rectangle aoiRect = AOIHelper.ComputeAOIRect(aoi, size); int[] filteredAOI = null; if (progressTracker != null) { progressTracker.Invoke(5, "正在过滤高温象元,请稍候..."); } //4% 高温像元(中红外通道) CreateArgument.PrintInfo(_contextMessage, "[开始]x%高温像元过滤..."); filter = CreateArgument.CreateHighTmpXPercentFilter(argProvider, _contextMessage); if (filter == null) { return; } filteredAOI = filter.Filter(argProvider.DataProvider, aoiRect, aoi); //by chennan 20130402 感兴趣内计算 UpdateFilteredAOIByAOI(ref filteredAOI, argProvider.AOI); if (filteredAOI != null) { _waitingFirPixels.Put(filteredAOI); CreateArgument.PrintInfo(_contextMessage, " x%高温点个数:" + filteredAOI.Length.ToString()); } CreateArgument.PrintInfo(_contextMessage, "[完成]x%高温像元过滤。"); if (progressTracker != null) { progressTracker.Invoke(10, "正在提取陆地高温点,请稍候..."); } //陆地高温点判识 CreateArgument.PrintInfo(_contextMessage, "[开始]陆地高温点过滤..."); filter = CreateArgument.CreateLandHighTmpFilter(argProvider, _contextMessage); //by chennan 20130402 感兴趣内计算 UpdateFilteredAOIByAOI(ref filteredAOI, argProvider.AOI); if (filter != null) { aoiRect = AOIHelper.ComputeAOIRect(filteredAOI, size); filteredAOI = filter.Filter(argProvider.DataProvider, aoiRect, filteredAOI); if (filteredAOI != null) { _candidateFirPixels.Put(filteredAOI); _waitingFirPixels.Remove(filteredAOI); CreateArgument.PrintInfo(_contextMessage, " 陆地高温点个数:" + filteredAOI.Length.ToString() + ",候选像元个数:" + _candidateFirPixels.Indexes.Count().ToString()); } } CreateArgument.PrintInfo(_contextMessage, "[完成]陆地高温点过滤。"); if (progressTracker != null) { progressTracker.Invoke(20, "正在提取异常高温点,请稍候..."); } //异常高温点判识 CreateArgument.PrintInfo(_contextMessage, "[开始]邻域内异常高温点过滤..."); filter = CreateArgument.CreateAbnormalHighTmpFile(argProvider, _contextMessage); //by chennan 20130402 感兴趣内计算 UpdateFilteredAOIByAOI(ref filteredAOI, argProvider.AOI); if (filter != null) { filteredAOI = _waitingFirPixels.Indexes.ToArray(); aoiRect = AOIHelper.ComputeAOIRect(filteredAOI, size); filteredAOI = filter.Filter(argProvider.DataProvider, aoiRect, filteredAOI); //by chennan 20130402 感兴趣内计算 UpdateFilteredAOIByAOI(ref filteredAOI, argProvider.AOI); if (filteredAOI != null) { _candidateFirPixels.Put(filteredAOI); _waitingFirPixels.Remove(filteredAOI); CreateArgument.PrintInfo(_contextMessage, " 异常高温点个数:" + filteredAOI.Length.ToString() + ",候选像元个数:" + _candidateFirPixels.Indexes.Count().ToString()); } } CreateArgument.PrintInfo(_contextMessage, "[完成]邻域内异常高温点过滤。"); if (progressTracker != null) { progressTracker.Invoke(30, "正在提取疑似高温点,请稍候..."); } //疑似火点判识 CreateArgument.PrintInfo(_contextMessage, "[开始]疑似火点判识..."); DoubtFirPixelFilter doubtFilter = CreateArgument.CreateDoubtFilter(argProvider, _contextMessage); if (doubtFilter == null) { return; } filteredAOI = _candidateFirPixels.Indexes.ToArray(); aoiRect = AOIHelper.ComputeAOIRect(filteredAOI, size); filteredAOI = doubtFilter.Filter(argProvider, aoiRect, filteredAOI); //by chennan 20130402 感兴趣内计算 UpdateFilteredAOIByAOI(ref filteredAOI, argProvider.AOI); if (filteredAOI == null) { CreateArgument.PrintInfo(_contextMessage, " 没有监测出疑似火点"); _candidateFirPixels.Reset(); return; } _candidateFirPixels.Reset(); _candidateFirPixels.Put(filteredAOI); CreateArgument.PrintInfo(_contextMessage, "[完成]疑似火点判识。"); CreateArgument.PrintInfo(_contextMessage, " 监测出疑似火点:" + filteredAOI.Length.ToString()); if (progressTracker != null) { progressTracker.Invoke(50, "正在计算背景温度,请稍候..."); } //背景温度计算 CreateArgument.PrintInfo(_contextMessage, "[开始]背景亮温计算..."); BackTmpComputer backTmpComputer = CreateArgument.CreateBackTmpComputer(argProvider, doubtFilter as IBackTmpComputerHelper, _contextMessage); if (backTmpComputer == null) { return; } aoiRect = AOIHelper.ComputeAOIRect(filteredAOI, size); features = backTmpComputer.Compute(argProvider, aoiRect, filteredAOI); //记录火点特征集合 _candidateFirPixels.Tag = new FirFeatureCollection("火点像元特征", features); CreateArgument.PrintInfo(_contextMessage, " 为" + features.Count.ToString() + "个疑似火点计算了背景亮温"); CreateArgument.PrintInfo(_contextMessage, "[完成]背景亮温计算。"); if (progressTracker != null) { progressTracker.Invoke(70, "正在进行火点确认,请稍候..."); } //火点确认 CreateArgument.PrintInfo(_contextMessage, "[开始]火点确认..."); VertifyFirPixelFiter vertifyFilter = CreateArgument.CreateVertifyFilter(argProvider, _contextMessage); if (vertifyFilter == null) { return; } filteredAOI = vertifyFilter.Filter(argProvider, features); _candidateFirPixels.Reset(); if (filteredAOI != null && filteredAOI.Length > 0) { _candidateFirPixels.Put(filteredAOI); CreateArgument.PrintInfo(_contextMessage, " 确认火点数:" + filteredAOI.Length.ToString()); GetFirePointIndeiex.WriteFireIndexiexFilename(argProvider, features.Keys.ToArray()); } CreateArgument.PrintInfo(_contextMessage, "[完成]火点确认。"); }