}//DrawPixelChanges

        /// <summary>
        /// Sets the reducedColumns structure, reduced the change value in each pixel
        /// to a range in between 0 and 255
        /// </summary>
        private void SetReducedColumns()
        {
            if (Columns == null)
            {
                throw new Exception("Matrix has no columns");
            }
            ReducedColumns = new List <PixelColumn>();

            double min     = MinChanged;
            double max     = MaxChanged;
            double highest = -MinChanged > MaxChanged ? -MinChanged : MaxChanged; //everything goes to positive as interested in distance from 0

            double divisor         = 255;
            double changesPerColor = highest / divisor;

            for (int i = 0; i < Columns.Count; i++)
            {
                PixelColumn col = new PixelColumn();
                col.Cells = new List <PixelCell>();

                for (int n = 0; n < Columns[i].Cells.Count; n++)
                {
                    PixelCell cell   = new PixelCell();
                    double    change = Columns[i].Cells[n].change < 0 ? -Columns[i].Cells[n].change : Columns[i].Cells[n].change;
                    cell.colour = 255 - Convert.ToInt16(change / changesPerColor);
                    col.Cells.Add(cell);
                }//height

                ReducedColumns.Add(col);
            } //width
        }     //SetReducedColumns
        }//DrawPixelChanges

        /// <summary>
        /// Sets the reducedColumns structure, reduced the change value in each pixel
        /// to a range in between 0 and 255
        /// </summary>
        private void SetReducedColumns()
        {
            if (Columns == null) { throw new Exception("Matrix has no columns"); }
            ReducedColumns = new List<PixelColumn>();
          
            double min = MinChanged;
            double max = MaxChanged;
            double highest = -MinChanged > MaxChanged ? -MinChanged : MaxChanged; //everything goes to positive as interested in distance from 0

            double divisor = 255;
            double changesPerColor = highest / divisor;

            for (int i = 0; i < Columns.Count; i++)
            {
                PixelColumn col = new PixelColumn();
                col.Cells = new List<PixelCell>();

                for (int n = 0; n < Columns[i].Cells.Count ; n++)
                {
                    PixelCell cell = new PixelCell();
                    double change = Columns[i].Cells[n].change < 0 ? -Columns[i].Cells[n].change : Columns[i].Cells[n].change;
                    cell.colour = 255 - Convert.ToInt16(change / changesPerColor);
                    col.Cells.Add(cell);
                }//height

                ReducedColumns.Add(col);

            }//width

        }//SetReducedColumns
        /// <summary>
        /// Does the actual population of the Pixel Matrix
        /// </summary>
        private void DoPopulate()
        {
            Columns    = new List <PixelColumn>();
            Comparator = null;
            if (LinkCompare)
            {
                Comparator = new List <PixelColumn>();
            }

            //set the search dimensions
            if (SearchWidth <= 0)
            {
                SearchWidth = image2.bitmap.Width;
            }
            if (SearchHeight <= 0)
            {
                SearchHeight = image2.bitmap.Height;
            }

            //set thepixel scanning dimensions
            if (WidthSearchOffset < 1)
            {
                WidthSearchOffset = 1;
            }
            if (HeightSearchOffset < 1)
            {
                HeightSearchOffset = 1;
            }

            if (GridSystemOn)
            {
                imageGrid = new ImageGrid(SearchWidth, SearchHeight);
            }

            //set some grid and comparator variables here, for scope reasons
            GridColumn  gridColumn       = null;
            Grid        grid             = null;
            PixelCell   comparatorCell   = null;
            PixelColumn comparatorColumn = null;

            //look at every pixel in each image, and compare the colours
            for (int i = 0; i < SearchWidth; i += WidthSearchOffset)
            {
                PixelColumn column = new PixelColumn();
                if (LinkCompare)
                {
                    comparatorColumn = new PixelColumn();
                }

                //set a new grid column, if required
                if (GridSystemOn)
                {
                    if (i == 0)
                    {
                        gridColumn = new GridColumn();
                    }
                    else if (i % imageGrid.GridWidth == 0)
                    {
                        imageGrid.Columns.Add(gridColumn); gridColumn = new GridColumn();
                    }
                }

                for (int n = 0; n < SearchHeight; n += HeightSearchOffset)
                {
                    PixelCell cell = new PixelCell();
                    if (LinkCompare)
                    {
                        comparatorCell = new PixelCell();
                    }

                    //set a new grid, if required
                    if (GridSystemOn)
                    {
                        if (n > 0 && n % imageGrid.GridHeight == 0 && i % imageGrid.GridWidth == 0)
                        {
                            gridColumn.grids.Add(grid);
                            grid = new Grid();
                        }
                        else if (n == 0 && i % imageGrid.GridWidth == 0)
                        {
                            grid = new Grid();
                        }
                    }

                    //get the pixel colours. image 1 pixel one either comes from image1, or the comparison PixelMatrix, if it exists
                    Int64 image1Pixel = Comparision == null?image1.bitmap.GetPixel(i, n).Name.HexToLong() : Comparision[i].Cells[n].colour;

                    Int64 image2Pixel = image2.bitmap.GetPixel(i, n).Name.HexToLong();

                    //set the comparator
                    if (LinkCompare)
                    {
                        comparatorCell.colour = image2Pixel; comparatorColumn.Cells.Add(comparatorCell);
                    }

                    if (image1Pixel != image2Pixel)
                    {
                        cell.hasChanged = true;
                        cell.change     = image1Pixel - image2Pixel;
                        if (GridSystemOn)
                        {
                            grid.change += cell.positiveChange;
                        }
                    }
                    else
                    {
                        cell.hasChanged = false;
                    }

                    column.Cells.Add(cell);

                    if (GridSystemOn && n + 1 == image1.bitmap.Height && i % imageGrid.GridWidth == 0)
                    {
                        gridColumn.grids.Add(grid);
                    }
                }//height

                Columns.Add(column);
                if (LinkCompare)
                {
                    Comparator.Add(comparatorColumn);
                }

                if (GridSystemOn && i + 1 == image1.bitmap.Width)
                {
                    imageGrid.Columns.Add(gridColumn);
                }
            }//width
        }
        /// <summary>
        /// Does the actual population of the Pixel Matrix
        /// </summary>
        private void DoPopulate()
        {
            Columns = new List<PixelColumn>();
            Comparator = null;
            if (LinkCompare) { Comparator = new List<PixelColumn>(); }

            //set the search dimensions
            if (SearchWidth <= 0 ) { SearchWidth = image2.bitmap.Width; }
            if (SearchHeight <= 0 ) { SearchHeight = image2.bitmap.Height; }

            //set thepixel scanning dimensions
            if (WidthSearchOffset < 1) { WidthSearchOffset = 1; }
            if (HeightSearchOffset < 1) { HeightSearchOffset = 1; }

            if (GridSystemOn) { imageGrid = new ImageGrid(SearchWidth, SearchHeight); }

            //set some grid and comparator variables here, for scope reasons
            GridColumn gridColumn = null;
            Grid grid = null;
            PixelCell comparatorCell = null;
            PixelColumn comparatorColumn = null;

            //look at every pixel in each image, and compare the colours
            for (int i = 0; i < SearchWidth; i += WidthSearchOffset)
            {
                PixelColumn column = new PixelColumn();
                if (LinkCompare) { comparatorColumn = new PixelColumn(); }

                //set a new grid column, if required
                if (GridSystemOn)
                {
                    if (i == 0) { gridColumn = new GridColumn(); }
                    else if (i % imageGrid.GridWidth == 0) { imageGrid.Columns.Add(gridColumn); gridColumn = new GridColumn(); }
                }

                for (int n = 0; n < SearchHeight; n += HeightSearchOffset)
                {
                    PixelCell cell = new PixelCell();
                    if (LinkCompare) { comparatorCell = new PixelCell(); }

                    //set a new grid, if required              
                    if (GridSystemOn)
                    {
                        if (n > 0 && n % imageGrid.GridHeight == 0 && i % imageGrid.GridWidth == 0)
                        {
                            gridColumn.grids.Add(grid);
                            grid = new Grid();
                        }
                        else if (n == 0 && i % imageGrid.GridWidth == 0)
                        {
                            grid = new Grid();
                        }
                    }

                    //get the pixel colours. image 1 pixel one either comes from image1, or the comparison PixelMatrix, if it exists
                    Int64 image1Pixel = Comparision == null ? image1.bitmap.GetPixel(i, n).Name.HexToLong() : Comparision[i].Cells[n].colour;
                    Int64 image2Pixel = image2.bitmap.GetPixel(i, n).Name.HexToLong();

                    //set the comparator
                    if (LinkCompare) { comparatorCell.colour = image2Pixel; comparatorColumn.Cells.Add(comparatorCell); }
                    
                    if (image1Pixel != image2Pixel)
                    {
                        cell.hasChanged = true;
                        cell.change = image1Pixel - image2Pixel;
                        if (GridSystemOn) { grid.change += cell.positiveChange; }
                    }
                    else
                    {
                        cell.hasChanged = false;
                    }

                    column.Cells.Add(cell);

                    if (GridSystemOn && n + 1 == image1.bitmap.Height && i % imageGrid.GridWidth == 0) { gridColumn.grids.Add(grid); }

                }//height

                Columns.Add(column);
                if (LinkCompare) { Comparator.Add(comparatorColumn); }

                if (GridSystemOn && i + 1 == image1.bitmap.Width) { imageGrid.Columns.Add(gridColumn); }

            }//width
        }