Beispiel #1
0
        private void VertifyFirPixel(ref Dictionary <int, PixelFeature> features, List <int> vertifyIndexiex, ref IPixelIndexMapper result)
        {
            if (features == null || features.Count == 0)
            {
                return;
            }
            List <int> pixelIndex = new List <int>();

            foreach (int item in features.Keys)
            {
                if (vertifyIndexiex.Contains(item))
                {
                    features[item].IsVertified = true;
                }
                else
                {
                    features[item].IsVertified = false;
                    pixelIndex.Add(item);
                }
            }
            if (pixelIndex.Count != 0)
            {
                result.Remove(pixelIndex.ToArray());
            }
        }
Beispiel #2
0
        public void ApplyResult(IPixelIndexMapper dltResult)
        {
            if (dltResult == null)
            {
                return;
            }
            TryExtCursorInfoForFeaturesDisplay(dltResult);
            //
            IArgumentProvider argprd = _currentSubProduct.ArgumentProvider;
            string            name   = GetName(_currentProduct, _currentSubProduct);
            IPixelIndexMapper result = _resultObjects[name].BinaryValues;

            if (argprd != null && argprd.AOI != null)
            {
                result.Remove(argprd.AOI);
                foreach (int idx in dltResult.Indexes)
                {
                    result.Put(idx);
                }
            }
            else
            {
                result.Reset();
                foreach (int idx in dltResult.Indexes)
                {
                    result.Put(idx);
                }
            }
            UpdateLayer(_resultObjects[name]);
            _isUpdated = true;
        }
Beispiel #3
0
        public void ApplyErase(int[] aoi)
        {
            string            name   = GetName(_currentProduct, _currentSubProduct);
            IPixelIndexMapper result = _resultObjects[name].BinaryValues;

            result.Remove(aoi);
            UpdateLayer(_resultObjects[name]);
            _isUpdated = true;
        }
Beispiel #4
0
        private unsafe void WriteResampledResult(Bitmap newBitmap, int offsetX, int offsetY, IPixelIndexMapper mapper, int[] aoi)
        {
            BitmapData pData    = newBitmap.LockBits(new Rectangle(0, 0, newBitmap.Width, newBitmap.Height), ImageLockMode.ReadOnly, newBitmap.PixelFormat);
            List <int> indexies = new List <int>();

            try
            {
                byte *ptr0       = (byte *)pData.Scan0;
                byte *ptr        = ptr0;
                int   stride     = pData.Stride;
                int   height     = newBitmap.Height;
                int   width      = newBitmap.Width;
                int   oWidth     = mapper.Size.Width;
                int   pixelWidth = 3;
                int   curIndex   = 0;
                for (int r = 0; r < height; r++, ptr = ptr0 + r * stride)
                {
                    for (int c = 0; c < width; c++, ptr += pixelWidth)
                    {
                        if (*ptr == 255)//blue
                        {
                            curIndex = (r + offsetY) * oWidth + c + offsetX;
                            indexies.Add(curIndex);
                        }
                    }
                }
                if (indexies.Count == 0)
                {
                    return;
                }
                if (aoi == null)
                {
                    mapper.Put(indexies.ToArray());
                }
                else
                {
                    mapper.Remove(aoi);
                    var intersect = aoi.Intersect(indexies);
                    if (intersect != null && intersect.Count() != 0)
                    {
                        mapper.Put(intersect.ToArray());
                    }
                }
            }
            finally
            {
                newBitmap.UnlockBits(pData);
            }
        }
Beispiel #5
0
        //橡皮檫
        private void HandleErase(object result)
        {
            if (_canvasViewer == null)
            {
                return;
            }
            GeometryOfDrawed    geometry = result as GeometryOfDrawed;
            IRasterDataProvider prd      = GetRasterDataProvider(_canvasViewer);

            using (IVectorAOIGenerator gen = new VectorAOIGenerator())
            {
                int[]             aoi    = gen.GetAOI(geometry.RasterPoints.Clone() as PointF[], geometry.Types, new Size(prd.Width, prd.Height));
                string            name   = GetName(_currentProduct, _currentSubProduct);
                IPixelIndexMapper mapper = _resultObjects[name].BinaryValues;
                mapper.Remove(aoi);
                UpdateLayer(_resultObjects[name]);
            }
        }
Beispiel #6
0
        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, "[完成]火点确认。");
        }