public EditableOperationBatch(DataImage resultImage)
 {
     steps = new List<EditableOperationBatchStep>();
     stepsDict = new Dictionary<string, EditableOperationBatchStep>();
     imageResult = resultImage;
     images = new Dictionary<string, DataImage>();
     imagesList = new List<DataImage>();
     CalculateSteps();
 }
    public int processImage(String name, int W, int H, int[] data)
    {
        //return 0;

        //Console.Out.WriteLine("processImage(" + name + "," + W.ToString() + "," + H.ToString() + ")");
        //Console.Out.Flush();
        currentImage = TopCoderMarathon2.ImageRetriever.GetData(name, W, H, data);
        //Console.Out.WriteLine("currentImage: " + currentImage.ToString());
        //Console.Out.Flush();
        AnalyzeData(currentImage);
        //Get
        return 0;
    }
        public static Cluster DetectCluster(DataImage resultImage, int xOrigin, int yOrigin, byte minColor, byte maxColor)
        {
            result = resultImage;
            data = result.data;
            pixelsChecked = new bool[data.Length];
            colorMin = minColor;
            colorMax = maxColor;
            height = result.Height;
            width = result.Width;

            ranges = new RangeQueue();
            currentCluster = new Cluster(resultImage);

            //////
            if (!(result[xOrigin, yOrigin] >= minColor && result[xOrigin, yOrigin] <= maxColor))
                throw new InvalidOperationException("Point is not within color range");
            /////\
            LinearDetect(ref xOrigin, ref yOrigin);

            while (ranges.size > 0)
            {
                DetectionRange range = ranges.Dequeue();

                int upY = range.y - 1;
                int downY = range.y + 1;

                int downIndex = resultImage.GetDataIndex(range.x1, downY);
                int upIndex = resultImage.GetDataIndex(range.x1, upY);

                int currentIndex;

                for (int x = range.x1; x <= range.x2; x++)
                {
                    currentIndex = result.GetDataIndex(x, upY);
                    if (range.y > 0 && (!pixelsChecked[upIndex]) && PixelIsWithinColorRange(ref currentIndex))
                        LinearDetect(ref x, ref upY);

                    currentIndex = result.GetDataIndex(x, downY);
                    if (range.y < (height - 1) && (!pixelsChecked[downIndex]) && PixelIsWithinColorRange(ref currentIndex))
                        LinearDetect(ref x, ref downY);
                    downIndex += height;
                    upIndex += height;
                }
            }
            Array.Resize<int>(ref currentCluster.indexes, currentCluster.Length);
            Array.Sort(currentCluster.Indexes);
            return currentCluster;
        }
        static DataImage GetDataImage(byte[] pixelData)
        {
            DataImage image = new DataImage(pixelData);

            return image;
        }
 /// <summary>
 /// Detects a cluster at the specified index and excludes it if the total area is below threshhold
 /// </summary>
 /// <param name="data"></param>
 /// <param name="i"></param>
 private Cluster DetectCluster(DataImage image, int dataIndex)
 {
     currentCluster = new Cluster(image);
     int x, y;
     image.GetDataCoordinates(dataIndex, out x, out y);
     return ClusterDetect.DetectCluster(image, x, y, mincolor, maxcolor);
 }
 public virtual void Analyze(DataImage image)
 {
     //image.Normalize();
     image.Save();
 }
 public DataImageLRO(DataImage dataImage)
     : base(dataImage)
 {
 }
 private void InitializeEditor(DataImage currentImage)
 {
     batch = new EditableOperationBatch(currentImage);
     LoadChooseStep();
     imageFixedResult.CurrentImage = batch.ImageResult;
 }
        //Recursive
        EditableOperationBatchStep AddBatchStep(DataImage image)
        {
            EditableOperationBatchStep step = new EditableOperationBatchStep(this, image);
            if (steps.Contains(step))
                return null; //already added

            if (image.ResultOf == null)
            {
                imageSource = image;
                return null; //do not add step for first image since there is no step for first image
            }

            EditableOperationBatchStep stepTemp = AddBatchStep(image.ResultOf.Source);
            if (stepTemp != null)
                steps.Add(stepTemp);

            //if (typeof(DualImageOperator).IsAssignableFrom(image.ResultOf.GetType()))
            //{
                try
                {
                    DualImageOperator d = (DualImageOperator)image.ResultOf;
                    stepTemp = AddBatchStep(((DualImageOperator)image.ResultOf).Source2);
                    if (stepTemp != null)
                        steps.Add(stepTemp);
                }
                catch (Exception)
                {
                }
               // }

            return step;
        }
 void TagImage(DataImage image)
 {
     if (!batch.ImagesList.Contains(image))
     {
         batch.ImagesList.Add(image);
         batch.Images.Add((batch.ImagesList.Count - 1).ToString(), image);
     }
 }
 string GetImageString(DataImage image)
 {
     return batch.ImagesList.IndexOf(image).ToString();
 }
        public EditableOperationBatchStep(EditableOperationBatch batch, DataImage image)
        {
            this.batch = batch;
            TagImage(image);

            this.operationResult = GetImageString(image);
            if (image.ResultOf != null)
            {
                TagImage(image.ResultOf.Source);
                this.source1 = GetImageString(image.ResultOf.Source);

                this.imageOperation = image.ResultOf.ImageOperation;
                try
                {

                    //if (typeof(DualImageOperation).IsAssignableFrom(imageOperation.GetType()))
                    //{
                        DualImageOperation d = (DualImageOperation)imageOperation;
                        TagImage(d.imageSource2);
                        this.source2 = GetImageString(d.imageSource2);
                    //}
                }
                catch (Exception)
                {
                }
            }
        }
        //Removes all no-op operations from the image graph
        bool RemoveNOOPs(DataImage image)
        {
            bool noopRemoved = false;
            if (image.ResultOf != null && image.ResultOf.ImageOperation.IsNOOP() && image.Parent != null)
            {
                RemoveNOOPImage(image);
                return true;
            }

            bool done = false;
            int counter = 0;
            int count = image.Children.Count;
            while (!done && image.Children.Count > 0)
            {
                DataImage c = image.Children[counter];
                noopRemoved = noopRemoved || RemoveNOOPs(c);
                if (count != image.Children.Count)
                    count = image.Children.Count;
                else
                    counter++;
                if (counter == image.Children.Count)
                    done = true;
            }
            return noopRemoved;
        }
 //Removes the image from the graph and updates parent/children
 void RemoveNOOPImage(DataImage image)
 {
     if (image == imageResult)
         ImageResult = image.Parent;
     while (image.Children.Count > 0)
     {
         image.Children[0].Parent = image.Parent;
     }
     image.Parent.Children.Remove(image);
 }
        private void ProcessSerializedStep(string entry)
        {
            // Console.Out.WriteLine("Processing Step: " + entry);
               // Console.Out.Flush();
            //R#:S1#:S2#:FUNC%PARAM1%PARAM2
            string[] parts = entry.Split(':');
            //////
            if (parts.Length != 4)
                throw new InvalidOperationException();
            /////\
            string resultKey = parts[0];
            string op = parts[3];

            if (op == "SRC")
            {
                DataImage imageSource = new DataImage(EditableOperationBatch.currentSourceData);
                this.imageSource = imageSource;
                images.Add(resultKey, imageSource);
            }
            else
            {
                EditableOperationBatchStep step = EditableOperationBatchStep.FromSerialization(entry);
                stepsDict.Add(step.Name, step);
                steps.Add(step);
            }
        }
 public override void Analyze(DataImage image)
 {
     base.Analyze(image);
 }
        private void LoadImage(DataImagePanel imagePanel, DataImage image)
        {
            Control c = imagePanel.Parent.Parent.Parent;
            if (c.GetType() == typeof(MonoControlContainer))
            {
                //Ensure that operator is properly set up
                MonoImageOperator op = new MonoImageOperator();
                MonoControlContainer mono = (MonoControlContainer)c;
                mono.imageOperator = op;
                mono.monoControlPanel1.CurrentControl = new NormalizeControl();
                mono.imageOperator.ImageOperation = mono.monoControlPanel1.CurrentControl.UnderlyingWidget;
                op.Source = image;
                imagePanel.CurrentImage = op.Result;
            }

            //Set up result panel
            if (mono1.dataImagePanel1.CurrentImage != null && mono2.dataImagePanel1.CurrentImage != null)
            {
                if (result.mono.CurrentControl == null)
                {
                    result.mono.CurrentControl = new NormalizeControl();
                    result.imageOperatorMono.ImageOperation = result.mono.CurrentControl.UnderlyingWidget;
                }
                if (result.dual.CurrentControl == null)
                {
                    result.dual.CurrentControl = new DualSubtractionControl();
                    result.imageOperatorDual.ImageOperation = result.dual.CurrentControl.UnderlyingWidget;
                }

                this.result.imageOperatorDual.Source = mono1.dataImagePanel1.CurrentImage;
                this.result.imageOperatorDual.Source2 = mono2.dataImagePanel1.CurrentImage;
                this.result.imageOperatorMono.Source = this.result.imageOperatorDual.Result;
                this.result.dataImagePanel1.CurrentImage = this.result.imageOperatorDual.Result;
                this.result.dataImagePanel1.labelImage.Text = this.result.dataImagePanel1.CurrentImage.Name;
            }

            imagePanel.labelImage.Text = imagePanel.CurrentImage.Name;
            CurrentControlChanged_Trigger();
        }
 public DataImageA15(DataImage dataImage)
     : base(dataImage)
 {
 }