Esempio n. 1
0
 public System.Drawing.Bitmap Segment(System.Drawing.Bitmap image, Image<Bgr, Byte> originalImage, System.Drawing.Rectangle rect)
 {
     _totalImage = new Image<Bgr, byte>(image);
     _mask = _totalImage.GrabCut(rect, ITERATIONCOUNT);
     CvInvoke.cvAndS(_mask.Ptr, new MCvScalar(1d), _mask.Ptr, IntPtr.Zero);
     Image<Bgr, Byte> result = originalImage.Copy(_mask);
     return result.ToBitmap();
 }
Esempio n. 2
0
 public ComparingThread(Image<Bgr, byte> imgDB, Image<Bgr, byte> imgReal, int i)
 {
     this.imgOrig = imgDB.Copy();
     ImageClass.CleanupSign(this.imgOrig);
     this.imgCmp = imgReal.Copy();
     this.isFinish = false;
     this.signPos = i;
 }
Esempio n. 3
0
 /// <summary>
 /// Learns the background statisitics for one more frame.
 /// </summary>
 /// <param name="image">Image to be accumulated for learning background statistics.</param>
 public void AccumulateBackground(Image<Gray, Single> image)
 {
     if (!first) {
     avg.Acc(image);
     CvInvoke.cvAbsDiff(image.Ptr, prev.Ptr, tmp1.Ptr);
     diff.Acc(tmp1);
     Count++;
       }
       first = false;
       prev = image.Copy();
 }
        public override Image<Rgb, byte> ProcessAndView(Image<Rgb, byte> image)
        {
            var outputImage = new Image<Rgb, byte>(image.Size.Width, image.Size.Height, Rgbs.Black);
            var debugImage = outputImage.Copy();

            //Convert the image to grayscale and filter out the noise
            var grayImage = image.Convert<Gray, Byte>();

            using (var storage = new MemStorage())
            {
                for (var contours = grayImage.FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, IsRetrieveExternal ? RETR_TYPE.CV_RETR_EXTERNAL : RETR_TYPE.CV_RETR_LIST, storage); contours != null; contours = contours.HNext)
                {
                    var currentContour = contours.ApproxPoly(contours.Perimeter * 0.05, storage);

                    //Console.WriteLine("AREA {0}", currentContour.Area);

                    //if (currentContour.Area > MinContourArea) //only consider contours with area greater than 250
                    //{
                        //outputImage.Draw(currentContour.GetConvexHull(ORIENTATION.CV_CLOCKWISE), Rgbs.White, 2);
                        outputImage.FillConvexPoly(currentContour.GetConvexHull(ORIENTATION.CV_CLOCKWISE).ToArray(), Rgbs.White);

                        if (IsRenderContent)
                            debugImage.FillConvexPoly(currentContour.GetConvexHull(ORIENTATION.CV_CLOCKWISE).ToArray(), Rgbs.White);
                    //}
                    //else
                    //{
                    //    if (IsRenderContent)
                    //        debugImage.FillConvexPoly(currentContour.GetConvexHull(ORIENTATION.CV_CLOCKWISE).ToArray(), Rgbs.Red);
                    //}
                }
            }

            Task.Factory.StartNew(() =>
            {
                var bitmapSource = debugImage.ToBitmapSource(true);
                debugImage.Dispose();
                return bitmapSource;
            }).ContinueWith(t => DebugImageSource = t.Result);

            grayImage.Dispose();

            return outputImage;
        }
Esempio n. 5
0
        public static Image<Gray, Byte> stripBorder(Image<Gray, Byte> image, Gray threshold)
        {
            bool found;

            int left;
            found = false;
            for (left = 0; left < image.Cols; left++)
            {
                for (int r = 0; r < image.Rows && !found; ++r)
                    if (image[r, left].Intensity >= threshold.Intensity)
                        found = true;
                if (found) break;
            }

            int right;
            found = false;
            for (right = image.Cols - 1; right >= 0; right--)
            {
                for (int r = 0; r < image.Rows && !found; ++r)
                    if (image[r, right].Intensity >= threshold.Intensity)
                        found = true;
                if (found) break;
            }

            int top;
            found = false;
            for (top = 0; top < image.Rows; top++)
            {
                for (int c = 0; c < image.Cols && !found; ++c)
                    if (image[top, c].Intensity >= threshold.Intensity)
                        found = true;
                if (found) break;
            }

            int bottom;
            found = false;
            for (bottom = image.Rows - 1; bottom >= 0; bottom--)
            {
                for (int c = 0; c < image.Cols && !found; ++c)
                    if (image[bottom, c].Intensity >= threshold.Intensity)
                        found = true;
                if (found) break;
            }

            if (right < left)
            {
                left = 0;
                right = 0;
            }

            if (bottom < top)
            {
                top = 0;
                bottom = 0;
            }

            return image.Copy(new System.Drawing.Rectangle(left, top, right-left + 1, bottom-top + 1));
        }
            public void WriteImages( Image targetImage )
            {
                if (tex!=null) {
                    targetImage.Copy( x + padding, y + padding, tex );
                }

                if (left!=null)  left.WriteImages( targetImage );
                if (right!=null) right.WriteImages( targetImage );
            }
        internal static void Median(Image<Bgr, byte> img)
        {
            unsafe
            {
                //new copy
                Image<Bgr, Byte> imgcopy = img.Copy();
                MIplImage m2 = imgcopy.MIplImage;
                byte* dataPtr2 = (byte*)m2.imageData.ToPointer();
                int nChan2 = m2.nChannels;
                int padding2 = m2.widthStep - m2.nChannels * m2.width;
                // get the pointer to the beginning of the image
                MIplImage m = img.MIplImage;
                byte* dataPtr = (byte*)m.imageData.ToPointer();
                int width = img.Width;
                int height = img.Height;
                int nChan = m.nChannels; // numero de canais 3
                int padding = m.widthStep - m.nChannels * m.width; // alinhamento (padding)
                int widthStep = m.widthStep;
                int widthStep2 = m2.widthStep;
                int width2 = imgcopy.Width;
                int height2 = imgcopy.Height;

                byte* dataPtrpom = dataPtr;
                byte* dataPtrpom2 = dataPtr2;

                int[] pixels = new int[3];

                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 0;

                //centre
                dataPtr += widthStep + nChan;
                dataPtr2 += widthStep2 + nChan2;
                int[] values = new int[9];
                for (int y = 1; y < height - 1; y++)
                {
                    for (int x = 1; x < width - 1; x++)
                    {
                        values[0] = Math.Abs((dataPtr2 - widthStep2 - nChan2)[0] - (dataPtr2 - widthStep2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 - widthStep2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 - widthStep2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 - nChan2)[0] - (dataPtr2 - widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 - widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 - widthStep2 + nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 - nChan2)[0] - (dataPtr2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 - nChan2)[0] - dataPtr2[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - dataPtr2[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - dataPtr2[2])
                            + Math.Abs((dataPtr2 - widthStep2 - nChan2)[0] - (dataPtr2 + nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 - nChan2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 - nChan2)[0] - (dataPtr2 + widthStep2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 - nChan2)[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        values[1] = Math.Abs((dataPtr2 - widthStep2)[0] - (dataPtr2 - widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2)[1] - (dataPtr2 - widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2)[2] - (dataPtr2 - widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2)[0] - (dataPtr2 - widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2)[1] - (dataPtr2 - widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2)[2] - (dataPtr2 - widthStep2 + nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2)[0] - (dataPtr2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2)[1] - (dataPtr2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2)[2] - (dataPtr2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2)[0] - dataPtr2[0]) + Math.Abs((dataPtr2 - widthStep2)[1] - dataPtr2[1]) + Math.Abs((dataPtr2 - widthStep2)[2] - dataPtr2[2])
                            + Math.Abs((dataPtr2 - widthStep2)[0] - (dataPtr2 + nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2)[0] - (dataPtr2 + widthStep2)[0]) + Math.Abs((dataPtr2 - widthStep2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2 - widthStep2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2 - widthStep2)[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        values[2] = Math.Abs((dataPtr2 - widthStep2 + nChan2)[0] - (dataPtr2 - widthStep2)[0]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[1] - (dataPtr2 - widthStep2)[1]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[2] - (dataPtr2 - widthStep2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 + nChan2)[0] - (dataPtr2 - widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[1] - (dataPtr2 - widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[2] - (dataPtr2 - widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 + nChan2)[0] - (dataPtr2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[1] - (dataPtr2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[2] - (dataPtr2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 + nChan2)[0] - dataPtr2[0]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[1] - dataPtr2[1]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[2] - dataPtr2[2])
                            + Math.Abs((dataPtr2 - widthStep2 + nChan2)[0] - (dataPtr2 + nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 + nChan2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 + nChan2)[0] - (dataPtr2 + widthStep2)[0]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2 - widthStep2 + nChan2)[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 + nChan2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        values[3] = Math.Abs((dataPtr2 - nChan2)[0] - (dataPtr2 - widthStep2)[0]) + Math.Abs((dataPtr2 - nChan2)[1] - (dataPtr2 - widthStep2)[1]) + Math.Abs((dataPtr2 - nChan2)[2] - (dataPtr2 - widthStep2)[2])
                            + Math.Abs((dataPtr2 - nChan2)[0] - (dataPtr2 - widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 - nChan2)[1] - (dataPtr2 - widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - nChan2)[2] - (dataPtr2 - widthStep2 + nChan2)[2])
                            + Math.Abs((dataPtr2 - nChan2)[0] - (dataPtr2 - widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - nChan2)[1] - (dataPtr2 - widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 - nChan2)[2] - (dataPtr2 - widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - nChan2)[0] - dataPtr2[0]) + Math.Abs((dataPtr2 - nChan2)[1] - dataPtr2[1]) + Math.Abs((dataPtr2 - nChan2)[2] - dataPtr2[2])
                            + Math.Abs((dataPtr2 - nChan2)[0] - (dataPtr2 + nChan2)[0]) + Math.Abs((dataPtr2 - nChan2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2 - nChan2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2 - nChan2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - nChan2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 - nChan2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 - nChan2)[0] - (dataPtr2 + widthStep2)[0]) + Math.Abs((dataPtr2 - nChan2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2 - nChan2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2 - nChan2)[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 - nChan2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - nChan2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        values[4] = Math.Abs((dataPtr2)[0] - (dataPtr2 - widthStep2)[0]) + Math.Abs((dataPtr2)[1] - (dataPtr2 - widthStep2)[1]) + Math.Abs((dataPtr2)[2] - (dataPtr2 - widthStep2)[2])
                            + Math.Abs((dataPtr2)[0] - (dataPtr2 - widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2)[1] - (dataPtr2 - widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2)[2] - (dataPtr2 - widthStep2 + nChan2)[2])
                            + Math.Abs((dataPtr2)[0] - (dataPtr2 - nChan2)[0]) + Math.Abs((dataPtr2)[1] - (dataPtr2 - nChan2)[1]) + Math.Abs((dataPtr2)[2] - (dataPtr2 - nChan2)[2])
                            + Math.Abs((dataPtr2)[0] - (dataPtr2 - widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2)[1] - (dataPtr2 - widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2)[2] - (dataPtr2 - widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2)[0] - (dataPtr2 + nChan2)[0]) + Math.Abs((dataPtr2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2)[0] - (dataPtr2 + widthStep2)[0]) + Math.Abs((dataPtr2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2)[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        values[5] = Math.Abs((dataPtr2 + nChan2)[0] - (dataPtr2 - widthStep2)[0]) + Math.Abs((dataPtr2 + nChan2)[1] - (dataPtr2 - widthStep2)[1]) + Math.Abs((dataPtr2 + nChan2)[2] - (dataPtr2 - widthStep2)[2])
                            + Math.Abs((dataPtr2 + nChan2)[0] - (dataPtr2 - widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + nChan2)[1] - (dataPtr2 - widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 + nChan2)[2] - (dataPtr2 - widthStep2 + nChan2)[2])
                            + Math.Abs((dataPtr2 + nChan2)[0] - (dataPtr2 - nChan2)[0]) + Math.Abs((dataPtr2 + nChan2)[1] - (dataPtr2 - nChan2)[1]) + Math.Abs((dataPtr2 + nChan2)[2] - (dataPtr2 - nChan2)[2])
                            + Math.Abs((dataPtr2 + nChan2)[0] - dataPtr2[0]) + Math.Abs((dataPtr2 + nChan2)[1] - dataPtr2[1]) + Math.Abs((dataPtr2 + nChan2)[2] - dataPtr2[2])
                            + Math.Abs((dataPtr2 + nChan2)[0] - (dataPtr2 - widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2 + nChan2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 + nChan2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 + nChan2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 + nChan2)[0] - (dataPtr2 + widthStep2)[0]) + Math.Abs((dataPtr2 + nChan2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2 + nChan2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2 + nChan2)[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + nChan2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 + nChan2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        values[6] = Math.Abs((dataPtr2 + widthStep2 - nChan2)[0] - (dataPtr2 - widthStep2)[0]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[1] - (dataPtr2 - widthStep2)[1]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[2] - (dataPtr2 - widthStep2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 - nChan2)[0] - (dataPtr2 - widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[1] - (dataPtr2 - widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[2] - (dataPtr2 - widthStep2 + nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 - nChan2)[0] - (dataPtr2 - nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[1] - (dataPtr2 - nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[2] - (dataPtr2 - nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 - nChan2)[0] - dataPtr2[0]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[1] - dataPtr2[1]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[2] - dataPtr2[2])
                            + Math.Abs((dataPtr2 + widthStep2 - nChan2)[0] - (dataPtr2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 - nChan2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 - nChan2)[0] - (dataPtr2 + widthStep2)[0]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 - nChan2)[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2 - nChan2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        values[7] = Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 - widthStep2)[0]) + Math.Abs((dataPtr2 + widthStep2)[1] - (dataPtr2 - widthStep2)[1]) + Math.Abs((dataPtr2 + widthStep2)[2] - (dataPtr2 - widthStep2)[2])
                            + Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 - widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2)[1] - (dataPtr2 - widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2)[2] - (dataPtr2 - widthStep2 + nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 - nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2)[1] - (dataPtr2 - nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2)[2] - (dataPtr2 - nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2)[0] - dataPtr2[0]) + Math.Abs((dataPtr2 + widthStep2)[1] - dataPtr2[1]) + Math.Abs((dataPtr2 + widthStep2)[2] - dataPtr2[2])
                            + Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 - widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        values[8] = Math.Abs((dataPtr2 + widthStep2 + nChan2)[0] - (dataPtr2 - widthStep2)[0]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[1] - (dataPtr2 - widthStep2)[1]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[2] - (dataPtr2 - widthStep2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 + nChan2)[0] - (dataPtr2 - widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[1] - (dataPtr2 - widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[2] - (dataPtr2 - widthStep2 + nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 + nChan2)[0] - (dataPtr2 - nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[1] - (dataPtr2 - nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[2] - (dataPtr2 - nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 + nChan2)[0] - dataPtr2[0]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[1] - dataPtr2[1]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[2] - dataPtr2[2])
                            + Math.Abs((dataPtr2 + widthStep2 + nChan2)[0] - (dataPtr2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[1] - (dataPtr2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[2] - (dataPtr2 + nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 + nChan2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[1] - (dataPtr2 + widthStep2 - nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[2] - (dataPtr2 + widthStep2 - nChan2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 + nChan2)[0] - (dataPtr2 + widthStep2)[0]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[1] - (dataPtr2 + widthStep2)[1]) + Math.Abs((dataPtr2 + widthStep2 + nChan2)[2] - (dataPtr2 + widthStep2)[2])
                            + Math.Abs((dataPtr2 + widthStep2 + nChan2)[0] - (dataPtr2 + widthStep2 - nChan2)[0]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 - widthStep2 - nChan2)[2] - (dataPtr2 + widthStep2 + nChan2)[2]);

                        int index = Array.IndexOf(values,values.Min());

                        switch (index)
                        {
                            case 0:
                                pixels[0] = (dataPtr2 - widthStep2 - nChan2)[0];
                                pixels[1] = (dataPtr2 - widthStep2 - nChan2)[1];
                                pixels[2] = (dataPtr2 - widthStep2 - nChan2)[2];
                                break;
                            case 1:
                                pixels[0] = (dataPtr2 - widthStep2)[0];
                                pixels[1] = (dataPtr2 - widthStep2)[1];
                                pixels[2] = (dataPtr2 - widthStep2)[2];
                                break;
                            case 2:
                                pixels[0] = (dataPtr2 - widthStep2 + nChan2)[0];
                                pixels[1] = (dataPtr2 - widthStep2 + nChan2)[1];
                                pixels[2] = (dataPtr2 - widthStep2 + nChan2)[2];
                                break;
                            case 3:
                                pixels[0] = (dataPtr2 - nChan2)[0];
                                pixels[1] = (dataPtr2 - nChan2)[1];
                                pixels[2] = (dataPtr2 - nChan2)[2];
                                break;
                            case 4:
                                pixels[0] = dataPtr2[0];
                                pixels[1] = dataPtr2[1];
                                pixels[2] = dataPtr2[2];
                                break;
                            case 5:
                                pixels[0] = (dataPtr2 + nChan2)[0];
                                pixels[1] = (dataPtr2 + nChan2)[1];
                                pixels[2] = (dataPtr2 + nChan2)[2];
                                break;
                            case 6:
                                pixels[0] = (dataPtr2 + widthStep2 - nChan2)[0];
                                pixels[1] = (dataPtr2 + widthStep2 - nChan2)[1];
                                pixels[2] = (dataPtr2 + widthStep2 - nChan2)[2];
                                break;
                            case 7:
                                pixels[0] = (dataPtr2 + widthStep2)[0];
                                pixels[1] = (dataPtr2 + widthStep2)[1];
                                pixels[2] = (dataPtr2 + widthStep2)[2];
                                break;
                            case 8:
                                pixels[0] = (dataPtr2 + widthStep2 + nChan2)[0];
                                pixels[1] = (dataPtr2 + widthStep2 + nChan2)[1];
                                pixels[2] = (dataPtr2 + widthStep2 + nChan2)[2];
                                break;
                            default: break;
                        }
                        dataPtr[0] = Convert.ToByte(pixels[0]);
                        dataPtr[1] = Convert.ToByte(pixels[1]);
                        dataPtr[2] = Convert.ToByte(pixels[2]);
                        pixels[0] = 0;
                        pixels[1] = 0;
                        pixels[2] = 0;
                        dataPtr += nChan;
                        dataPtr2 += nChan2;
                    }
                    dataPtr += 2 * nChan + padding;
                    dataPtr2 += 2 * nChan2 + padding2;
                }
                //top left corner
              /*  dataPtr = dataPtrpom;
                dataPtr2 = dataPtrpom2;
                values[0] = dataPtr2[0];
                values[1] = dataPtr2[0];
                values[2] = (dataPtr2 + nChan2)[0];
                values[3] = dataPtr2[0];
                values[4] = dataPtr2[0];
                values[5] = (dataPtr2 + nChan2)[0];
                values[6] = (dataPtr2 + widthStep2)[0];
                values[7] = (dataPtr2 + widthStep2)[0];
                values[8] = (dataPtr2 + widthStep2 + nChan2)[0];
                Array.Sort<int>(values);
                pixels[0] = values[4];
                values[0] = dataPtr2[1];
                values[1] = dataPtr2[1];
                values[2] = (dataPtr2 + nChan2)[1];
                values[3] = dataPtr2[1];
                values[4] = dataPtr2[1];
                values[5] = (dataPtr2 + nChan2)[1];
                values[6] = (dataPtr2 + widthStep2)[1];
                values[7] = (dataPtr2 + widthStep2)[1];
                values[8] = (dataPtr2 + widthStep2 + nChan2)[1];
                Array.Sort<int>(values);
                pixels[1] = values[4];
                values[0] = dataPtr2[2];
                values[1] = dataPtr2[2];
                values[2] = (dataPtr2 + nChan2)[2];
                values[3] = dataPtr2[2];
                values[4] = dataPtr2[2];
                values[5] = (dataPtr2 + nChan2)[2];
                values[6] = (dataPtr2 + widthStep2)[2];
                values[7] = (dataPtr2 + widthStep2)[2];
                values[8] = (dataPtr2 + widthStep2 + nChan2)[2];
                Array.Sort<int>(values);
                pixels[2] = values[4];
                dataPtr[0] = Convert.ToByte(pixels[0]);
                dataPtr[1] = Convert.ToByte(pixels[1]);
                dataPtr[2] = Convert.ToByte(pixels[2]);
                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 0;
                //top
                dataPtr += nChan;
                dataPtr2 += nChan2;
                for(int x = 1; x < width2 - 1; x++)
                {
                    values[0] = (dataPtr2 - nChan2)[0];
                    values[1] = dataPtr2[0];
                    values[2] = (dataPtr2 + nChan2)[0];
                    values[3] = (dataPtr2 - nChan2)[0];
                    values[4] = dataPtr2[0];
                    values[5] = (dataPtr2 + nChan2)[0];
                    values[6] = (dataPtr2 + widthStep2 - nChan2)[0];
                    values[7] = (dataPtr2 + widthStep2)[0];
                    values[8] = (dataPtr2 + widthStep2 + nChan2)[0];
                    Array.Sort<int>(values);
                    pixels[0] = values[4];
                    values[0] = (dataPtr2 - nChan2)[1];
                    values[1] = dataPtr2[1];
                    values[2] = (dataPtr2 + nChan2)[1];
                    values[3] = (dataPtr2 - nChan2)[1];
                    values[4] = dataPtr2[1];
                    values[5] = (dataPtr2 + nChan2)[1];
                    values[6] = (dataPtr2 + widthStep2 - nChan2)[1];
                    values[7] = (dataPtr2 + widthStep2)[1];
                    values[8] = (dataPtr2 + widthStep2 + nChan2)[1];
                    Array.Sort<int>(values);
                    pixels[1] = values[4];
                    values[0] = (dataPtr2 - nChan2)[2];
                    values[1] = dataPtr2[2];
                    values[2] = (dataPtr2 + nChan2)[2];
                    values[3] = (dataPtr2 - nChan2)[2];
                    values[4] = dataPtr2[2];
                    values[5] = (dataPtr2 + nChan2)[2];
                    values[6] = (dataPtr2 + widthStep2 - nChan2)[2];
                    values[7] = (dataPtr2 + widthStep2)[2];
                    values[8] = (dataPtr2 + widthStep2 + nChan2)[2];
                    Array.Sort<int>(values);
                    pixels[2] = values[4];
                    dataPtr[0] = Convert.ToByte(pixels[0]);
                    dataPtr[1] = Convert.ToByte(pixels[1]);
                    dataPtr[2] = Convert.ToByte(pixels[2]);
                    pixels[0] = 0;
                    pixels[1] = 0;
                    pixels[2] = 0;
                    dataPtr += nChan;
                    dataPtr2 += nChan2;
                }
                //top wright corner
                values[0] = (dataPtr2 - nChan2)[0];
                values[1] = dataPtr2[0];
                values[2] = dataPtr2[0];
                values[3] = (dataPtr2 - nChan2)[0];
                values[4] = dataPtr2[0];
                values[5] = dataPtr2[0];
                values[6] = (dataPtr2 + widthStep2 - nChan2)[0];
                values[7] = (dataPtr2 + widthStep2)[0];
                values[8] = (dataPtr2 + widthStep2)[0];
                Array.Sort<int>(values);
                pixels[0] = values[4];
                values[0] = (dataPtr2 - nChan2)[1];
                values[1] = dataPtr2[1];
                values[2] = dataPtr2[1];
                values[3] = (dataPtr2 - nChan2)[1];
                values[4] = dataPtr2[1];
                values[5] = dataPtr2[1];
                values[6] = (dataPtr2 + widthStep2)[1];
                values[7] = (dataPtr2 + widthStep2)[1];
                values[8] = (dataPtr2 + widthStep2 + nChan2)[1];
                Array.Sort<int>(values);
                pixels[1] = values[4];
                values[0] = (dataPtr2 - nChan2)[2];
                values[1] = dataPtr2[2];
                values[2] = dataPtr2[2];
                values[3] = (dataPtr2 - nChan2)[2];
                values[4] = dataPtr2[2];
                values[5] = dataPtr2[2];
                values[6] = (dataPtr2 + widthStep2 - nChan2)[2];
                values[7] = (dataPtr2 + widthStep2)[2];
                values[8] = (dataPtr2 + widthStep2)[2];
                Array.Sort<int>(values);
                pixels[2] = values[4];
                dataPtr[0] = Convert.ToByte(pixels[0]);
                dataPtr[1] = Convert.ToByte(pixels[1]);
                dataPtr[2] = Convert.ToByte(pixels[2]);
                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 0;
                //right
                dataPtr += widthStep;
                dataPtr2 += widthStep2;
                for(int y = 1; y < height2 - 1; y++)
                {
                    values[0] = (dataPtr2 - widthStep2 - nChan2)[0];
                    values[1] = (dataPtr2 - widthStep2)[0];
                    values[2] = (dataPtr2 - widthStep2)[0];
                    values[3] = (dataPtr2 - nChan2)[0];
                    values[4] = dataPtr2[0];
                    values[5] = dataPtr2[0];
                    values[6] = (dataPtr2 + widthStep2 - nChan2)[0];
                    values[7] = (dataPtr2 + widthStep2)[0];
                    values[8] = (dataPtr2 + widthStep2)[0];
                    Array.Sort<int>(values);
                    pixels[0] = values[4];
                    values[0] = (dataPtr2 - widthStep2 - nChan2)[1];
                    values[1] = (dataPtr2 - widthStep2)[1];
                    values[2] = (dataPtr2 - widthStep2)[1];
                    values[3] = (dataPtr2 - nChan2)[1];
                    values[4] = dataPtr2[1];
                    values[5] = dataPtr2[1];
                    values[6] = (dataPtr2 + widthStep2 - nChan2)[1];
                    values[7] = (dataPtr2 + widthStep2)[1];
                    values[8] = (dataPtr2 + widthStep2)[1];
                    Array.Sort<int>(values);
                    pixels[1] = values[4];
                    values[0] = (dataPtr2 - widthStep2 - nChan2)[2];
                    values[1] = (dataPtr2 - widthStep2)[2];
                    values[2] = (dataPtr2 - widthStep2)[2];
                    values[3] = (dataPtr2 - nChan2)[2];
                    values[4] = dataPtr2[2];
                    values[5] = dataPtr2[2];
                    values[6] = (dataPtr2 + widthStep2 - nChan2)[2];
                    values[7] = (dataPtr2 + widthStep2)[2];
                    values[8] = (dataPtr2 + widthStep2)[2];
                    Array.Sort<int>(values);
                    pixels[2] = values[4];
                    dataPtr[0] = Convert.ToByte(pixels[0]);
                    dataPtr[1] = Convert.ToByte(pixels[1]);
                    dataPtr[2] = Convert.ToByte(pixels[2]);
                    pixels[0] = 0;
                    pixels[1] = 0;
                    pixels[2] = 0;
                    dataPtr += widthStep;
                    dataPtr2 += widthStep2;
                }
                //bottom right corner
                values[0] = (dataPtr2 - widthStep2 - nChan2)[0];
                values[1] = (dataPtr2 - widthStep2)[0];
                values[2] = (dataPtr2 - widthStep2)[0];
                values[3] = (dataPtr2 - nChan2)[0];
                values[4] = dataPtr2[0];
                values[5] = dataPtr2[0];
                values[6] = (dataPtr2- nChan2)[0];
                values[7] = dataPtr2[0];
                values[8] = dataPtr2[0];
                Array.Sort<int>(values);
                pixels[0] = values[4];
                values[0] = (dataPtr2 - widthStep2 - nChan2)[1];
                values[1] = (dataPtr2 - widthStep2)[1];
                values[2] = (dataPtr2 - widthStep2)[1];
                values[3] = (dataPtr2 - nChan2)[1];
                values[4] = dataPtr2[1];
                values[5] = dataPtr2[1];
                values[6] = (dataPtr2- nChan2)[1];
                values[7] = dataPtr2[1];
                values[8] = dataPtr2[1];
                Array.Sort<int>(values);
                pixels[1] = values[4];
                values[0] = (dataPtr2 - widthStep2 - nChan2)[2];
                values[1] = (dataPtr2 - widthStep2)[2];
                values[2] = (dataPtr2 - widthStep2)[2];
                values[3] = (dataPtr2 - nChan2)[2];
                values[4] = dataPtr2[2];
                values[5] = dataPtr2[2];
                values[6] = (dataPtr2- nChan2)[2];
                values[7] = dataPtr2[2];
                values[8] = dataPtr2[2];
                Array.Sort<int>(values);
                pixels[2] = values[4];
                dataPtr[0] = Convert.ToByte(pixels[0]);
                dataPtr[1] = Convert.ToByte(pixels[1]);
                dataPtr[2] = Convert.ToByte(pixels[2]);
                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 0;
                //bottom
                dataPtr -= nChan;
                dataPtr2 -= nChan2;
                for(int x = 1; x < width2 - 1; x++)
                {
                    values[0] = (dataPtr2 - widthStep2 - nChan2)[0];
                    values[1] = (dataPtr2 - widthStep2)[0];
                    values[2] = (dataPtr2 - widthStep2 + nChan2)[0];
                    values[3] = (dataPtr2 - nChan2)[0];
                    values[4] = dataPtr2[0];
                    values[5] = (dataPtr2 + nChan2)[0];
                    values[6] = (dataPtr2 - nChan2)[0];
                    values[7] = dataPtr2[0];
                    values[8] = (dataPtr2 + nChan2)[0];
                    Array.Sort<int>(values);
                    pixels[0] = values[4];
                    values[0] = (dataPtr2 - widthStep2 - nChan2)[1];
                    values[1] = (dataPtr2 - widthStep2)[1];
                    values[2] = (dataPtr2 - widthStep2 + nChan2)[1];
                    values[3] = (dataPtr2 - nChan2)[1];
                    values[4] = dataPtr2[1];
                    values[5] = (dataPtr2 + nChan2)[1];
                    values[6] = (dataPtr2 - nChan2)[1];
                    values[7] = dataPtr2[1];
                    values[8] = (dataPtr2 + nChan2)[1];
                    Array.Sort<int>(values);
                    pixels[1] = values[4];
                    values[0] = (dataPtr2 - widthStep2 - nChan2)[2];
                    values[1] = (dataPtr2 - widthStep2)[2];
                    values[2] = (dataPtr2 - widthStep2 + nChan2)[2];
                    values[3] = (dataPtr2 - nChan2)[2];
                    values[4] = dataPtr2[2];
                    values[5] = (dataPtr2 + nChan2)[2];
                    values[6] = (dataPtr2 - nChan2)[2];
                    values[7] = dataPtr2[2];
                    values[8] = (dataPtr2 + nChan2)[2];
                    Array.Sort<int>(values);
                    pixels[2] = values[4];
                    dataPtr[0] = Convert.ToByte(pixels[0]);
                    dataPtr[1] = Convert.ToByte(pixels[1]);
                    dataPtr[2] = Convert.ToByte(pixels[2]);
                    pixels[0] = 0;
                    pixels[1] = 0;
                    pixels[2] = 0;
                    dataPtr -= nChan;
                    dataPtr2 -= nChan2;
                }
                //bottom left corner
                values[0] = (dataPtr2 - widthStep2)[0];
                values[1] = (dataPtr2 - widthStep2)[0];
                values[2] = (dataPtr2 - widthStep2 + nChan2)[0];
                values[3] = dataPtr2[0];
                values[4] = dataPtr2[0];
                values[5] = (dataPtr2 + nChan2)[0];
                values[6] = dataPtr2[0];
                values[7] = dataPtr2[0];
                values[8] = (dataPtr2 + nChan2)[0];
                Array.Sort<int>(values);
                pixels[0] = values[4];
                values[0] = (dataPtr2 - widthStep2)[1];
                values[1] = (dataPtr2 - widthStep2)[1];
                values[2] = (dataPtr2 - widthStep2 + nChan2)[1];
                values[3] = dataPtr2[1];
                values[4] = dataPtr2[1];
                values[5] = (dataPtr2 + nChan2)[1];
                values[6] = dataPtr2[1];
                values[7] = dataPtr2[1];
                values[8] = (dataPtr2 + nChan2)[1];
                Array.Sort<int>(values);
                pixels[1] = values[4];
                values[0] = (dataPtr2 - widthStep2)[2];
                values[1] = (dataPtr2 - widthStep2)[2];
                values[2] = (dataPtr2 - widthStep2 + nChan2)[2];
                values[3] = dataPtr2[2];
                values[4] = dataPtr2[2];
                values[5] = (dataPtr2 + nChan2)[2];
                values[6] = dataPtr2[2];
                values[7] = dataPtr2[2];
                values[8] = (dataPtr2 + nChan2)[2];
                Array.Sort<int>(values);
                pixels[2] = values[4];
                dataPtr[0] = Convert.ToByte(pixels[0]);
                dataPtr[1] = Convert.ToByte(pixels[1]);
                dataPtr[2] = Convert.ToByte(pixels[2]);
                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 0;

                //left
                dataPtr -= widthStep;
                dataPtr2 -= widthStep2;
                for(int y = 1; y < height2 - 1; y++)
                {
                    values[0] = (dataPtr2 - widthStep2)[0];
                    values[1] = (dataPtr2 - widthStep2)[0];
                    values[2] = (dataPtr2 - widthStep2 + nChan2)[0];
                    values[3] = dataPtr2[0];
                    values[4] = dataPtr2[0];
                    values[5] = (dataPtr2 + nChan2)[0];
                    values[6] = (dataPtr2 + widthStep2)[0];
                    values[7] = (dataPtr2 + widthStep2)[0];
                    values[8] = (dataPtr2 + widthStep2 + nChan2)[0];
                    Array.Sort<int>(values);
                    pixels[0] = values[4];
                    values[0] = (dataPtr2 - widthStep2)[1];
                    values[1] = (dataPtr2 - widthStep2)[1];
                    values[2] = (dataPtr2 - widthStep2 + nChan2)[1];
                    values[3] = dataPtr2[1];
                    values[4] = dataPtr2[1];
                    values[5] = (dataPtr2 + nChan2)[1];
                    values[6] = (dataPtr2 + widthStep2)[1];
                    values[7] = (dataPtr2 + widthStep2)[1];
                    values[8] = (dataPtr2 + widthStep2 + nChan2)[1];
                    Array.Sort<int>(values);
                    pixels[1] = values[4];
                    values[0] = (dataPtr2 - widthStep2)[2];
                    values[1] = (dataPtr2 - widthStep2)[2];
                    values[2] = (dataPtr2 - widthStep2 + nChan2)[2];
                    values[3] = dataPtr2[2];
                    values[4] = dataPtr2[2];
                    values[5] = (dataPtr2 + nChan2)[2];
                    values[6] = (dataPtr2 + widthStep2)[2];
                    values[7] = (dataPtr2 + widthStep2)[2];
                    values[8] = (dataPtr2 + widthStep2 + nChan2)[2];
                    Array.Sort<int>(values);
                    pixels[2] = values[4];
                    dataPtr[0] = Convert.ToByte(pixels[0]);
                    dataPtr[1] = Convert.ToByte(pixels[1]);
                    dataPtr[2] = Convert.ToByte(pixels[2]);
                    pixels[0] = 0;
                    pixels[1] = 0;
                    pixels[2] = 0;
                    dataPtr -= widthStep;
                    dataPtr2 -= widthStep2;
                }*/

            }
        }
        /*this is the function to be checked*/
        internal static void NoiseReduction(Image<Bgr, byte> img, int w11, int w12, int w13, int w21, int w22, int w23, int w31, int w32, int w33, double wmain)
        {
            unsafe
            {
                //new copy
                Image<Bgr, Byte> imgcopy = img.Copy();
                MIplImage m2 = imgcopy.MIplImage;
                byte* dataPtr2 = (byte*)m2.imageData.ToPointer();
                int nChan2 = m2.nChannels;
                int padding2 = m2.widthStep - m2.nChannels * m2.width;
                // get the pointer to the beginning of the image
                MIplImage m = img.MIplImage;
                byte* dataPtr = (byte*)m.imageData.ToPointer();
                int width = img.Width;
                int height = img.Height;
                int nChan = m.nChannels; // numero de canais 3
                int padding = m.widthStep - m.nChannels * m.width; // alinhamento (padding)
                int widthStep = m.widthStep;
                int widthStep2 = m2.widthStep;
                int width2 = imgcopy.Width;
                int height2 = imgcopy.Height;

                byte* dataPtrpom = dataPtr;
                byte* dataPtrpom2 = dataPtr2;

                int[] pixels = new int[3];

                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 0;

                //centre
                dataPtr += widthStep + nChan;
                dataPtr2 += widthStep2 + nChan2;

                for (int y = 1; y < height - 1; y++)
                {
                    for (int x = 1; x < width - 1; x++)
                    {
                        pixels[0] += (dataPtr2 - widthStep2 - nChan2)[0] * w11;
                        pixels[1] += (dataPtr2 - widthStep2 - nChan2)[1] * w11;
                        pixels[2] += (dataPtr2 - widthStep2 - nChan2)[2] * w11;
                        pixels[0] += (dataPtr2 - widthStep2)[0] * w12;
                        pixels[1] += (dataPtr2 - widthStep2)[1] * w12;
                        pixels[2] += (dataPtr2 - widthStep2)[2] * w12;
                        pixels[0] += (dataPtr2 - widthStep2 + nChan2)[0] * w13;
                        pixels[1] += (dataPtr2 - widthStep2 + nChan2)[1] * w13;
                        pixels[2] += (dataPtr2 - widthStep2 + nChan2)[2] * w13;
                        pixels[0] += (dataPtr2 - nChan2)[0] * w21;
                        pixels[1] += (dataPtr2 - nChan2)[1] * w21;
                        pixels[2] += (dataPtr2 - nChan2)[2] * w21;
                        pixels[0] += dataPtr2[0] * w22;
                        pixels[1] += dataPtr2[1] * w22;
                        pixels[2] += dataPtr2[2] * w22;
                        pixels[0] += (dataPtr2 + nChan2)[0] * w23;
                        pixels[1] += (dataPtr2 + nChan2)[1] * w23;
                        pixels[2] += (dataPtr2 + nChan2)[2] * w23;
                        pixels[0] += (dataPtr2 + widthStep2 - nChan2)[0] * w31;
                        pixels[1] += (dataPtr2 + widthStep2 - nChan2)[1] * w31;
                        pixels[2] += (dataPtr2 + widthStep2 - nChan2)[2] * w31;
                        pixels[0] += (dataPtr2 + widthStep2)[0] * w32;
                        pixels[1] += (dataPtr2 + widthStep2)[1] * w32;
                        pixels[2] += (dataPtr2 + widthStep2)[2] * w32;
                        pixels[0] += (dataPtr2 + widthStep2 + nChan2)[0] * w33;
                        pixels[1] += (dataPtr2 + widthStep2 + nChan2)[1] * w33;
                        pixels[2] += (dataPtr2 + widthStep2 + nChan2)[2] * w33;

                        pixels[0] = Convert.ToInt32(pixels[0] / wmain);
                        pixels[1] = Convert.ToInt32(pixels[1] / wmain);
                        pixels[2] = Convert.ToInt32(pixels[2] / wmain);
                        if (pixels[0] > 255)
                            pixels[0] = 255;
                        if (pixels[1] > 255)
                            pixels[1] = 255;
                        if (pixels[2] > 255)
                            pixels[2] = 255;
                        if (pixels[0] < 0)
                            pixels[0] = 0;
                        if (pixels[1] < 0)
                            pixels[1] = 0;
                        if (pixels[2] < 0)
                            pixels[2] = 0;
                        dataPtr[0] = Convert.ToByte(pixels[0]);
                        dataPtr[1] = Convert.ToByte(pixels[1]);
                        dataPtr[2] = Convert.ToByte(pixels[2]);
                        pixels[0] = 0;
                        pixels[1] = 0;
                        pixels[2] = 0;
                        dataPtr += nChan;
                        dataPtr2 += nChan2;
                    }
                    dataPtr += 2 * nChan + padding;
                    dataPtr2 +=  2 * nChan2 + padding2;
                }

                dataPtr = dataPtrpom;
                dataPtr2 = dataPtrpom2;

                int[] sum = new int[3]; //left top corner
                sum[0] += dataPtr2[0] * (w11 + w12 + w21 + w22);
                sum[1] += dataPtr2[1] * (w11 + w12 + w21 + w22);
                sum[2] += dataPtr2[2] * (w11 + w12 + w21 + w22);
                dataPtr2 += nChan2;
                sum[0] += dataPtr2[0] * (w13 + w23);
                sum[1] += dataPtr2[2] * (w13 + w23);
                sum[2] += dataPtr2[2] * (w13 + w23);
                dataPtr2 += widthStep;
                sum[0] += dataPtr2[0] * (w31 + w32);
                sum[1] += dataPtr2[1] * (w31 + w32);
                sum[2] += dataPtr2[2] * (w31 + w32);
                dataPtr2 -= nChan2;
                sum[0] += dataPtr2[0] * w33;
                sum[1] += dataPtr2[1] * w33;
                sum[2] += dataPtr2[2] * w33;

                sum[0] = Convert.ToInt32(sum[0] / wmain);
                sum[1] = Convert.ToInt32(sum[1] / wmain);
                sum[2] = Convert.ToInt32(sum[2] / wmain);
                if (sum[0] > 255)
                    sum[0] = 255;
                if (sum[1] > 255)
                    sum[1] = 255;
                if (sum[2] > 255)
                    sum[2] = 255;
                if (sum[0] < 0)
                    sum[0] = 0;
                if (sum[1] < 0)
                    sum[1] = 0;
                if (sum[2] < 0)
                    sum[2] = 0;
                dataPtr[0] = Convert.ToByte(sum[0]);
                dataPtr[1] = Convert.ToByte(sum[1]);
                dataPtr[2] = Convert.ToByte(sum[2]);

                dataPtr += nChan;

                sum[0] = 0;
                sum[1] = 0;
                sum[2] = 0;

                dataPtr2 = dataPtrpom2;

                //top
                for (int i = 0; i < width - 2; i++)
                {
                    sum[0] += dataPtr2[0] * (w11 + w21);
                    sum[1] += dataPtr2[1] * (w11 + w21);
                    sum[2] += dataPtr2[2] * (w11 + w21);
                    dataPtr2 += nChan2;
                    sum[0] += dataPtr2[0] * (w12 + w22);
                    sum[1] += dataPtr2[1] * (w12 + w22);
                    sum[2] += dataPtr2[2] * (w12 + w22);
                    dataPtr2 += nChan2;
                    sum[0] += dataPtr2[0] * (w13 + w23);
                    sum[1] += dataPtr2[1] * (w13 + w23);
                    sum[2] += dataPtr2[2] * (w13 + w23);
                    dataPtr2 += widthStep - 2 * nChan2;
                    sum[0] += dataPtr2[0] * w31;
                    sum[1] += dataPtr2[1] * w31;
                    sum[2] += dataPtr2[2] * w31;
                    dataPtr2 += nChan2;
                    sum[0] += dataPtr2[0] * w32;
                    sum[1] += dataPtr2[1] * w32;
                    sum[2] += dataPtr2[2] * w32;
                    dataPtr2 += nChan2;
                    sum[0] += dataPtr2[0] * w33;
                    sum[1] += dataPtr2[1] * w33;
                    sum[2] += dataPtr2[2] * w33;
                    dataPtr2 += -widthStep - nChan2;

                    sum[0] = Convert.ToInt32(sum[0] / wmain);
                    sum[1] = Convert.ToInt32(sum[1] / wmain);
                    sum[2] = Convert.ToInt32(sum[2] / wmain);
                    if (sum[0] > 255)
                        sum[0] = 255;
                    if (sum[1] > 255)
                        sum[1] = 255;
                    if (sum[2] > 255)
                        sum[2] = 255;
                    if (sum[0] < 0)
                        sum[0] = 0;
                    if (sum[1] < 0)
                        sum[1] = 0;
                    if (sum[2] < 0)
                        sum[2] = 0;
                    dataPtr[0] = Convert.ToByte(sum[0]);
                    dataPtr[1] = Convert.ToByte(sum[1]);
                    dataPtr[2] = Convert.ToByte(sum[2]);

                    dataPtr += nChan;

                    sum[0] = 0;
                    sum[1] = 0;
                    sum[2] = 0;
                }

                //right top corner
                dataPtr2 += nChan2;

                sum[0] += dataPtr2[0] * (w12 + w13 + w22 + w23);
                sum[1] += dataPtr2[1] * (w12 + w13 + w22 + w23);
                sum[2] += dataPtr2[2] * (w12 + w13 + w22 + w23);
                dataPtr2 -= nChan2;
                sum[0] += dataPtr2[0] * (w11 + w21);
                sum[1] += dataPtr2[2] * (w11 + w21);
                sum[2] += dataPtr2[2] * (w11 + w21);
                dataPtr2 += widthStep;
                sum[0] += dataPtr2[0] * w31;
                sum[1] += dataPtr2[1] * w31;
                sum[2] += dataPtr2[2] * w31;
                dataPtr2 += nChan2;
                sum[0] += 2 * dataPtr2[0] * (w32 + w33);
                sum[1] += 2 * dataPtr2[1] * (w32 + w33);
                sum[2] += 2 * dataPtr2[2] * (w32 + w33);

                sum[0] = Convert.ToInt32(sum[0] / wmain);
                sum[1] = Convert.ToInt32(sum[1] / wmain);
                sum[2] = Convert.ToInt32(sum[2] / wmain);
                if (sum[0] > 255)
                    sum[0] = 255;
                if (sum[1] > 255)
                    sum[1] = 255;
                if (sum[2] > 255)
                    sum[2] = 255;
                if (sum[0] < 0)
                    sum[0] = 0;
                if (sum[1] < 0)
                    sum[1] = 0;
                if (sum[2] < 0)
                    sum[2] = 0;
                dataPtr[0] = Convert.ToByte(sum[0]);
                dataPtr[1] = Convert.ToByte(sum[1]);
                dataPtr[2] = Convert.ToByte(sum[2]);

                dataPtr += widthStep;
                sum[0] = 0;
                sum[1] = 0;
                sum[2] = 0;

                //right
                dataPtr2 -= widthStep;
                for (int i = 0; i < height - 2; i++)
                {
                    sum[0] += dataPtr2[0] * (w12 + w13);
                    sum[1] += dataPtr2[1] * (w12 + w13);
                    sum[2] += dataPtr2[2] * (w12 + w13);
                    dataPtr2 -= nChan2;
                    sum[0] += dataPtr2[0] * w11;
                    sum[1] += dataPtr2[1] * w11;
                    sum[2] += dataPtr2[2] * w11;
                    dataPtr2 += widthStep;
                    sum[0] += dataPtr2[0] * w21;
                    sum[1] += dataPtr2[1] * w21;
                    sum[2] += dataPtr2[2] * w21;
                    dataPtr2 += widthStep;
                    sum[0] += dataPtr2[0] * w31;
                    sum[1] += dataPtr2[1] * w31;
                    sum[2] += dataPtr2[2] * w31;
                    dataPtr2 += nChan2;
                    sum[0] += dataPtr2[0] * (w32 + w33);
                    sum[1] += dataPtr2[1] * (w32 + w33);
                    sum[2] += dataPtr2[2] * (w32 + w33);
                    dataPtr2 -= widthStep;
                    sum[0] += dataPtr2[0] * (w22 + w23);
                    sum[1] += dataPtr2[1] * (w22 + w23);
                    sum[2] += dataPtr2[2] * (w22 + w23);

                    sum[0] = Convert.ToInt32(sum[0] / wmain);
                    sum[1] = Convert.ToInt32(sum[1] / wmain);
                    sum[2] = Convert.ToInt32(sum[2] / wmain);
                    if (sum[0] > 255)
                        sum[0] = 255;
                    if (sum[1] > 255)
                        sum[1] = 255;
                    if (sum[2] > 255)
                        sum[2] = 255;
                    if (sum[0] < 0)
                        sum[0] = 0;
                    if (sum[1] < 0)
                        sum[1] = 0;
                    if (sum[2] < 0)
                        sum[2] = 0;
                    dataPtr[0] = Convert.ToByte(sum[0]);
                    dataPtr[1] = Convert.ToByte(sum[1]);
                    dataPtr[2] = Convert.ToByte(sum[2]);

                    dataPtr += widthStep;

                    sum[0] = 0;
                    sum[1] = 0;
                    sum[2] = 0;
                }

                //bottom corner right

                dataPtr2 += widthStep;

                sum[0] += dataPtr2[0] * (w32 + w33 + w22 + w23);
                sum[1] += dataPtr2[1] * (w32 + w33 + w22 + w23);
                sum[2] += dataPtr2[2] * (w32 + w33 + w22 + w23);
                dataPtr2 -= nChan2;
                sum[0] += dataPtr2[0] * (w31 + w21);
                sum[1] += dataPtr2[2] * (w31 + w21);
                sum[2] += dataPtr2[2] * (w31 + w21);
                dataPtr2 -= widthStep;
                sum[0] += dataPtr2[0] * w11;
                sum[1] += dataPtr2[1] * w11;
                sum[2] += dataPtr2[2] * w11;
                dataPtr2 += nChan2;
                sum[0] += dataPtr2[0] * (w12 + w13);
                sum[1] += dataPtr2[1] * (w12 + w13);
                sum[2] += dataPtr2[2] * (w12 + w13);

                sum[0] = Convert.ToInt32(sum[0] / wmain);
                sum[1] = Convert.ToInt32(sum[1] / wmain);
                sum[2] = Convert.ToInt32(sum[2] / wmain);
                if (sum[0] > 255)
                    sum[0] = 255;
                if (sum[1] > 255)
                    sum[1] = 255;
                if (sum[2] > 255)
                    sum[2] = 255;
                if (sum[0] < 0)
                    sum[0] = 0;
                if (sum[1] < 0)
                    sum[1] = 0;
                if (sum[2] < 0)
                    sum[2] = 0;
                dataPtr[0] = Convert.ToByte(sum[0]);
                dataPtr[1] = Convert.ToByte(sum[1]);
                dataPtr[2] = Convert.ToByte(sum[2]);

                sum[0] = 0;
                sum[1] = 0;
                sum[2] = 0;

                dataPtr -= nChan;
                dataPtr2 += widthStep;
                //bottom
                for (int i = 0; i < width - 2; i++)
                {
                    sum[0] += dataPtr2[0] * (w33 + w23);
                    sum[1] += dataPtr2[1] * (w33 + w23);
                    sum[2] += dataPtr2[2] * (w33 + w23);
                    dataPtr2 -= nChan2;
                    sum[0] += dataPtr2[0] * (w32 + w22);
                    sum[1] += dataPtr2[1] * (w32 + w22);
                    sum[2] += dataPtr2[2] * (w32 + w22);
                    dataPtr2 -= nChan2;
                    sum[0] += dataPtr2[0] * (w31 + w21);
                    sum[1] += dataPtr2[1] * (w31 + w21);
                    sum[2] += dataPtr2[2] * (w31 + w21);
                    dataPtr2 -= widthStep;
                    sum[0] += dataPtr2[0] * w11;
                    sum[1] += dataPtr2[1] * w11;
                    sum[2] += dataPtr2[2] * w11;
                    dataPtr2 += nChan2;
                    sum[0] += dataPtr2[0] * w12;
                    sum[1] += dataPtr2[1] * w12;
                    sum[2] += dataPtr2[2] * w12;
                    dataPtr2 += nChan2;
                    sum[0] += dataPtr2[0] * w13;
                    sum[1] += dataPtr2[1] * w13;
                    sum[2] += dataPtr2[2] * w13;

                    sum[0] = Convert.ToInt32(sum[0] / wmain);
                    sum[1] = Convert.ToInt32(sum[1] / wmain);
                    sum[2] = Convert.ToInt32(sum[2] / wmain);
                    if (sum[0] > 255)
                        sum[0] = 255;
                    if (sum[1] > 255)
                        sum[1] = 255;
                    if (sum[2] > 255)
                        sum[2] = 255;
                    if (sum[0] < 0)
                        sum[0] = 0;
                    if (sum[1] < 0)
                        sum[1] = 0;
                    if (sum[2] < 0)
                        sum[2] = 0;
                    dataPtr[0] = Convert.ToByte(sum[0]);
                    dataPtr[1] = Convert.ToByte(sum[1]);
                    dataPtr[2] = Convert.ToByte(sum[2]);

                    sum[0] = 0;
                    sum[1] = 0;
                    sum[2] = 0;

                    dataPtr -= nChan;
                    dataPtr2 += widthStep - nChan2;
                }
                /////////////////////
                //left corner bottom
                dataPtr += nChan;
                dataPtr2 += -nChan2;

                sum[0] += dataPtr2[0] * (w21 + w22 + w31 + w32);
                sum[1] += dataPtr2[1] * (w21 + w22 + w31 + w32);
                sum[2] += dataPtr2[2] * (w21 + w22 + w31 + w32);
                dataPtr2 += nChan2;
                sum[0] += dataPtr2[0] * (w23 + w33);
                sum[1] += dataPtr2[2] * (w23 + w33);
                sum[2] += dataPtr2[2] * (w23 + w33);
                dataPtr2 -= widthStep;
                sum[0] += dataPtr2[0] * w13;
                sum[1] += dataPtr2[1] * w13;
                sum[2] += dataPtr2[2] * w13;
                dataPtr2 -= nChan2;
                sum[0] += dataPtr2[0] * (w11 + w12);
                sum[1] += dataPtr2[1] * (w11 + w12);
                sum[2] += dataPtr2[2] * (w11 + w12);

                sum[0] = Convert.ToInt32(sum[0] / wmain);
                sum[1] = Convert.ToInt32(sum[1] / wmain);
                sum[2] = Convert.ToInt32(sum[2] / wmain);
                if (sum[0] > 255)
                    sum[0] = 255;
                if (sum[1] > 255)
                    sum[1] = 255;
                if (sum[2] > 255)
                    sum[2] = 255;
                if (sum[0] < 0)
                    sum[0] = 0;
                if (sum[1] < 0)
                    sum[1] = 0;
                if (sum[2] < 0)
                    sum[2] = 0;
                dataPtr[0] = Convert.ToByte(sum[0]);
                dataPtr[1] = Convert.ToByte(sum[1]);
                dataPtr[2] = Convert.ToByte(sum[2]);

                sum[0] = 0;
                sum[1] = 0;
                sum[2] = 0;

                dataPtr -= widthStep;
                dataPtr2 += widthStep;
                //left
                for (int i = 0; i < height - 2; i++)
                {
                    sum[0] += dataPtr2[0] * (w31 + w32);
                    sum[1] += dataPtr2[1] * (w31 + w32);
                    sum[2] += dataPtr2[2] * (w31 + w32);
                    dataPtr2 -= widthStep;
                    sum[0] += dataPtr2[0] * (w21 + w22);
                    sum[1] += dataPtr2[1] * (w21 + w22);
                    sum[2] += dataPtr2[2] * (w21 + w22);
                    dataPtr2 -= widthStep;
                    sum[0] += dataPtr2[0] * (w11 + w12);
                    sum[1] += dataPtr2[1] * (w11 + w12);
                    sum[2] += dataPtr2[2] * (w11 + w12);
                    dataPtr2 += nChan2;
                    sum[0] += dataPtr2[0] * w13;
                    sum[1] += dataPtr2[1] * w13;
                    sum[2] += dataPtr2[2] * w13;
                    dataPtr2 += widthStep;
                    sum[0] += dataPtr2[0] * w23;
                    sum[1] += dataPtr2[1] * w23;
                    sum[2] += dataPtr2[2] * w23;
                    dataPtr2 += widthStep;
                    sum[0] += dataPtr2[0] * w33;
                    sum[1] += dataPtr2[1] * w33;
                    sum[2] += dataPtr2[2] * w33;

                    sum[0] = Convert.ToInt32(sum[0] / wmain);
                    sum[1] = Convert.ToInt32(sum[1] / wmain);
                    sum[2] = Convert.ToInt32(sum[2] / wmain);
                    if (sum[0] > 255)
                        sum[0] = 255;
                    if (sum[1] > 255)
                        sum[1] = 255;
                    if (sum[2] > 255)
                        sum[2] = 255;
                    if (sum[0] < 0)
                        sum[0] = 0;
                    if (sum[1] < 0)
                        sum[1] = 0;
                    if (sum[2] < 0)
                        sum[2] = 0;
                    dataPtr[0] = Convert.ToByte(sum[0]);
                    dataPtr[1] = Convert.ToByte(sum[1]);
                    dataPtr[2] = Convert.ToByte(sum[2]);

                    sum[0] = 0;
                    sum[1] = 0;
                    sum[2] = 0;

                    dataPtr -= widthStep;
                    dataPtr2 += -nChan2 - widthStep;
                }

                dataPtr = dataPtrpom;
                dataPtr2 = dataPtrpom2;

            }
        }
        internal static void Translate(Image<Bgr, byte> img, int movex, int movey)
        {
            unsafe
            {
                //new copy
                Image<Bgr, Byte> imgcopy = img.Copy();
                MIplImage m2 = imgcopy.MIplImage;
                byte* dataPtr2 = (byte*)m2.imageData.ToPointer();
                int nChan2 = m2.nChannels;
                int padding2 = m2.widthStep - m2.nChannels * m2.width;
                // get the pointer to the beginning of the image
                MIplImage m = img.MIplImage;
                byte* dataPtr = (byte*)m.imageData.ToPointer();
                int width = img.Width;
                int height = img.Height;
                int nChan = m.nChannels; // numero de canais 3
                int padding = m.widthStep - m.nChannels * m.width; // alinhamento (padding)

                byte* dataPtrpom = dataPtr;

                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                         if (x < movex)
                         {
                             dataPtr[0] = 0;
                             dataPtr[1] = 0;
                             dataPtr[2] = 0;
                         }

                         if (y < movey)
                         {
                             dataPtr[0] = 0;
                             dataPtr[1] = 0;
                             dataPtr[2] = 0;
                         }
                        dataPtr += nChan;
                    }
                    dataPtr += padding;
                }

                dataPtr = dataPtrpom;
                for (int i = 0; i < movey; i++)
                {
                    dataPtr += nChan*width;
                    dataPtr += padding;
                }
                dataPtr += nChan*movex;

                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        dataPtr[0] = dataPtr2[0];
                        dataPtr[1] = dataPtr2[1];
                        dataPtr[2] = dataPtr2[2];

                        dataPtr2 += nChan2;

                        if(x<width-movex)
                            dataPtr += nChan;
                    }

                    dataPtr2 += padding2;
                    dataPtr += padding;
                    dataPtr += nChan*movex;
                }

            }
        }
Esempio n. 10
0
        internal static void Sobel(Image<Bgr, byte> img)
        {
            unsafe
            {
                //new copy
                Image<Bgr, Byte> imgcopy = img.Copy();
                MIplImage m2 = imgcopy.MIplImage;
                byte* dataPtr2 = (byte*)m2.imageData.ToPointer();
                int nChan2 = m2.nChannels;
                int padding2 = m2.widthStep - m2.nChannels * m2.width;
                // get the pointer to the beginning of the image
                MIplImage m = img.MIplImage;
                byte* dataPtr = (byte*)m.imageData.ToPointer();
                int width = img.Width;
                int height = img.Height;
                int nChan = m.nChannels; // numero de canais 3
                int padding = m.widthStep - m.nChannels * m.width; // alinhamento (padding)
                int widthStep = m.widthStep;
                int widthStep2 = m2.widthStep;
                int width2 = imgcopy.Width;
                int height2 = imgcopy.Height;

                byte* dataPtrpom = dataPtr;
                byte* dataPtrpom2 = dataPtr2;
                int[] pixels1 = new int[3];
                int[] pixels2 = new int[3];
                int[] s = new int[3];

                pixels1[0] = 0;
                pixels1[1] = 0;
                pixels1[2] = 0;

                pixels2[0] = 0;
                pixels2[1] = 0;
                pixels2[2] = 0;

                s[0] = 0;
                s[1] = 0;
                s[2] = 0;

                dataPtr += widthStep + nChan;
                dataPtr2 += widthStep + nChan2;

                //centre
                for (int y = 1; y < height - 1; y++)
                {
                    for (int x = 1; x < width - 1; x++)
                    {
                        //left pixels1
                        pixels1[0] += (dataPtr2 - widthStep2 - nChan2)[0];
                        pixels1[1] += (dataPtr2 - widthStep2 - nChan2)[1];
                        pixels1[2] += (dataPtr2 - widthStep2 - nChan2)[2];
                        pixels1[0] += 2 * (dataPtr2 - nChan2)[0];
                        pixels1[1] += 2 * (dataPtr2 - nChan2)[1];
                        pixels1[2] += 2 * (dataPtr2 - nChan2)[2];
                        pixels1[0] += (dataPtr2 + widthStep - nChan2)[0];
                        pixels1[1] += (dataPtr2 + widthStep - nChan2)[1];
                        pixels1[2] += (dataPtr2 + widthStep - nChan2)[2];
                        //right pixels1
                        pixels1[0] = pixels1[0] - (dataPtr2 - widthStep2 + nChan2)[0];
                        pixels1[1] = pixels1[1] - (dataPtr2 - widthStep2 + nChan2)[1];
                        pixels1[2] = pixels1[2] - (dataPtr2 - widthStep2 + nChan2)[2];
                        pixels1[0] = pixels1[0] - 2 * (dataPtr2 + nChan2)[0];
                        pixels1[1] = pixels1[1] - 2 * (dataPtr2 + nChan2)[1];
                        pixels1[2] = pixels1[2] - 2 * (dataPtr2 + nChan2)[2];
                        pixels1[0] = pixels1[0] - (dataPtr2 + widthStep + nChan2)[0];
                        pixels1[1] = pixels1[1] - (dataPtr2 + widthStep + nChan2)[1];
                        pixels1[2] = pixels1[2] - (dataPtr2 + widthStep + nChan2)[2];

                        //bottom pixels2
                        pixels2[0] += (dataPtr2 + widthStep - nChan)[0];
                        pixels2[1] += (dataPtr2 + widthStep - nChan)[1];
                        pixels2[2] += (dataPtr2 + widthStep - nChan)[2];
                        pixels2[0] += 2 * (dataPtr2 + widthStep)[0];
                        pixels2[1] += 2 * (dataPtr2 + widthStep)[1];
                        pixels2[2] += 2 * (dataPtr2 + widthStep)[2];
                        pixels2[0] += (dataPtr2 + widthStep + nChan)[0];
                        pixels2[1] += (dataPtr2 + widthStep + nChan)[1];
                        pixels2[2] += (dataPtr2 + widthStep + nChan)[2];
                        //top pixels2
                        pixels2[0] = pixels2[0] - (dataPtr2 - widthStep - nChan)[0];
                        pixels2[1] = pixels2[1] - (dataPtr2 - widthStep - nChan)[1];
                        pixels2[2] = pixels2[2] - (dataPtr2 - widthStep - nChan)[2];
                        pixels2[0] = pixels2[0] - 2 * (dataPtr2 - widthStep)[0];
                        pixels2[1] = pixels2[1] - 2 * (dataPtr2 - widthStep)[1];
                        pixels2[2] = pixels2[2] - 2 * (dataPtr2 - widthStep)[2];
                        pixels2[0] = pixels2[0] - (dataPtr2 - widthStep + nChan)[0];
                        pixels2[1] = pixels2[1] - (dataPtr2 - widthStep + nChan)[1];
                        pixels2[2] = pixels2[2] - (dataPtr2 - widthStep + nChan)[2];

                        s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                        s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                        s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                        //check
                        if (s[0] > 255)
                            s[0] = 255;
                        if (s[1] > 255)
                            s[1] = 255;
                        if (s[2] > 255)
                            s[2] = 255;
                        if (s[0] < 0)
                            s[0] = 0;
                        if (s[1] < 0)
                            s[1] = 0;
                        if (s[2] < 0)
                            s[2] = 0;

                        dataPtr[0] = Convert.ToByte(s[0]);
                        dataPtr[1] = Convert.ToByte(s[1]);
                        dataPtr[2] = Convert.ToByte(s[2]);

                        s[0] = 0;
                        s[1] = 0;
                        s[2] = 0;

                        pixels1[0] = 0;
                        pixels1[1] = 0;
                        pixels1[2] = 0;

                        pixels2[0] = 0;
                        pixels2[1] = 0;
                        pixels2[2] = 0;

                        dataPtr += nChan;
                        dataPtr2 += nChan2;

                    }
                    dataPtr += 2 * nChan + padding;
                    dataPtr2 += 2 * nChan2 + padding2;
                }

                dataPtr = dataPtrpom;
                dataPtr2 = dataPtrpom2;

                //left corner
                //left pixels1
                pixels1[0] += 3 * dataPtr2[0];
                pixels1[1] += 3 * dataPtr2[1];
                pixels1[2] += 3 * dataPtr2[2];
                pixels1[0] += (dataPtr2 + widthStep)[0];
                pixels1[1] += (dataPtr2 + widthStep)[1];
                pixels1[2] += (dataPtr2 + widthStep)[2];

                //right pixels1
                pixels1[0] = pixels1[0] - 3 * (dataPtr2 + nChan2)[0];
                pixels1[1] = pixels1[1] - 3 * (dataPtr2 + nChan2)[1];
                pixels1[2] = pixels1[2] - 3 * (dataPtr2 + nChan2)[2];
                pixels1[0] = pixels1[0] - (dataPtr2 + widthStep + nChan2)[0];
                pixels1[1] = pixels1[1] - (dataPtr2 + widthStep + nChan2)[1];
                pixels1[2] = pixels1[2] - (dataPtr2 + widthStep + nChan2)[2];

                //bottom pixels2
                pixels2[0] += 3 * (dataPtr2 + widthStep)[0];
                pixels2[1] += 3 * (dataPtr2 + widthStep)[1];
                pixels2[2] += 3 * (dataPtr2 + widthStep)[2];
                pixels2[0] += (dataPtr2 + widthStep + nChan)[0];
                pixels2[1] += (dataPtr2 + widthStep + nChan)[1];
                pixels2[2] += (dataPtr2 + widthStep + nChan)[2];
                //top pixels2
                pixels2[0] = pixels2[0] - 3 * (dataPtr2)[0];
                pixels2[1] = pixels2[1] - 3 * (dataPtr2)[1];
                pixels2[2] = pixels2[2] - 3 * (dataPtr2)[2];
                pixels2[0] = pixels2[0] - (dataPtr2 + nChan)[0];
                pixels2[1] = pixels2[1] - (dataPtr2 + nChan)[1];
                pixels2[2] = pixels2[2] - (dataPtr2 + nChan)[2];

                s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                //check
                if (s[0] > 255)
                    s[0] = 255;
                if (s[1] > 255)
                    s[1] = 255;
                if (s[2] > 255)
                    s[2] = 255;
                if (s[0] < 0)
                    s[0] = 0;
                if (s[1] < 0)
                    s[1] = 0;
                if (s[2] < 0)
                    s[2] = 0;

                dataPtr[0] = Convert.ToByte(s[0]);
                dataPtr[1] = Convert.ToByte(s[1]);
                dataPtr[2] = Convert.ToByte(s[2]);

                s[0] = 0;
                s[1] = 0;
                s[2] = 0;

                pixels1[0] = 0;
                pixels1[1] = 0;
                pixels1[2] = 0;

                pixels2[0] = 0;
                pixels2[1] = 0;
                pixels2[2] = 0;

                //frame top
                dataPtr = dataPtrpom + nChan;
                dataPtr2 = dataPtrpom2 + nChan;

                for (int i = 0; i < width - 2; i++)
                {
                    //left pixels1
                    pixels1[0] += 3 * (dataPtr2 - nChan2)[0];
                    pixels1[1] += 3 * (dataPtr2 - nChan2)[1];
                    pixels1[2] += 3 * (dataPtr2 - nChan2)[2];
                    pixels1[0] += (dataPtr2 + widthStep - nChan2)[0];
                    pixels1[1] += (dataPtr2 + widthStep - nChan2)[1];
                    pixels1[2] += (dataPtr2 + widthStep - nChan2)[2];

                    //right pixels1
                    pixels1[0] = pixels1[0] - 3 * (dataPtr2 + nChan2)[0];
                    pixels1[1] = pixels1[1] - 3 * (dataPtr2 + nChan2)[1];
                    pixels1[2] = pixels1[2] - 3 * (dataPtr2 + nChan2)[2];
                    pixels1[0] = pixels1[0] - (dataPtr2 + widthStep + nChan2)[0];
                    pixels1[1] = pixels1[1] - (dataPtr2 + widthStep + nChan2)[1];
                    pixels1[2] = pixels1[2] - (dataPtr2 + widthStep + nChan2)[2];

                    //bottom pixels2
                    pixels2[0] += (dataPtr2 + widthStep - nChan)[0];
                    pixels2[1] += (dataPtr2 + widthStep - nChan)[1];
                    pixels2[2] += (dataPtr2 + widthStep - nChan)[2];
                    pixels2[0] += 2 * (dataPtr2 + widthStep)[0];
                    pixels2[1] += 2 * (dataPtr2 + widthStep)[1];
                    pixels2[2] += 2 * (dataPtr2 + widthStep)[2];
                    pixels2[0] += (dataPtr2 + widthStep + nChan)[0];
                    pixels2[1] += (dataPtr2 + widthStep + nChan)[1];
                    pixels2[2] += (dataPtr2 + widthStep + nChan)[2];
                    //top pixels2
                    pixels2[0] = pixels2[0] - (dataPtr2 - nChan)[0];
                    pixels2[1] = pixels2[1] - (dataPtr2 - nChan)[1];
                    pixels2[2] = pixels2[2] - (dataPtr2 - nChan)[2];
                    pixels2[0] = pixels2[0] - 2 * (dataPtr2)[0];
                    pixels2[1] = pixels2[1] - 2 * (dataPtr2)[1];
                    pixels2[2] = pixels2[2] - 2 * (dataPtr2)[2];
                    pixels2[0] = pixels2[0] - (dataPtr2 + nChan)[0];
                    pixels2[1] = pixels2[1] - (dataPtr2 + nChan)[1];
                    pixels2[2] = pixels2[2] - (dataPtr2 + nChan)[2];

                    s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                    s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                    s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                    //check
                    if (s[0] > 255)
                        s[0] = 255;
                    if (s[1] > 255)
                        s[1] = 255;
                    if (s[2] > 255)
                        s[2] = 255;
                    if (s[0] < 0)
                        s[0] = 0;
                    if (s[1] < 0)
                        s[1] = 0;
                    if (s[2] < 0)
                        s[2] = 0;

                    dataPtr[0] = Convert.ToByte(s[0]);
                    dataPtr[1] = Convert.ToByte(s[1]);
                    dataPtr[2] = Convert.ToByte(s[2]);

                    s[0] = 0;
                    s[1] = 0;
                    s[2] = 0;

                    pixels1[0] = 0;
                    pixels1[1] = 0;
                    pixels1[2] = 0;

                    pixels2[0] = 0;
                    pixels2[1] = 0;
                    pixels2[2] = 0;

                    dataPtr += nChan;
                    dataPtr2 += nChan2;

                }
                //right corner

                //left pixels1
                pixels1[0] += 3 * (dataPtr2 - nChan2)[0];
                pixels1[1] += 3 * (dataPtr2 - nChan2)[1];
                pixels1[2] += 3 * (dataPtr2 - nChan2)[2];
                pixels1[0] += (dataPtr2 + widthStep2 - nChan2)[0];
                pixels1[1] += (dataPtr2 + widthStep2 - nChan2)[1];
                pixels1[2] += (dataPtr2 + widthStep2 - nChan2)[2];
                //right pixels1
                pixels1[0] = pixels1[0] - 3 * (dataPtr2)[0];
                pixels1[1] = pixels1[1] - 3 * (dataPtr2)[1];
                pixels1[2] = pixels1[2] - 3 * (dataPtr2)[2];
                pixels1[0] = pixels1[0] - (dataPtr2 + widthStep)[0];
                pixels1[1] = pixels1[1] - (dataPtr2 + widthStep)[1];
                pixels1[2] = pixels1[2] - (dataPtr2 + widthStep)[2];

                //bottom pixels2
                pixels2[0] += (dataPtr2 + widthStep - nChan2)[0];
                pixels2[1] += (dataPtr2 + widthStep - nChan2)[1];
                pixels2[2] += (dataPtr2 + widthStep - nChan2)[2];
                pixels2[0] += 3 * (dataPtr2 + widthStep)[0];
                pixels2[1] += 3 * (dataPtr2 + widthStep)[1];
                pixels2[2] += 3 * (dataPtr2 + widthStep)[2];
                //top pixels2
                pixels2[0] = pixels2[0] - (dataPtr2 - nChan2)[0];
                pixels2[1] = pixels2[1] - (dataPtr2 - nChan2)[1];
                pixels2[2] = pixels2[2] - (dataPtr2 - nChan2)[2];
                pixels2[0] = pixels2[0] - 3 * (dataPtr2)[0];
                pixels2[1] = pixels2[1] - 3 * (dataPtr2)[1];
                pixels2[2] = pixels2[2] - 3 * (dataPtr2)[2];

                s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                //check
                if (s[0] > 255)
                    s[0] = 255;
                if (s[1] > 255)
                    s[1] = 255;
                if (s[2] > 255)
                    s[2] = 255;
                if (s[0] < 0)
                    s[0] = 0;
                if (s[1] < 0)
                    s[1] = 0;
                if (s[2] < 0)
                    s[2] = 0;

                dataPtr[0] = Convert.ToByte(s[0]);
                dataPtr[1] = Convert.ToByte(s[1]);
                dataPtr[2] = Convert.ToByte(s[2]);

                s[0] = 0;
                s[1] = 0;
                s[2] = 0;

                pixels1[0] = 0;
                pixels1[1] = 0;
                pixels1[2] = 0;

                //right frame

                dataPtr += widthStep;
                dataPtr2 += widthStep;

                for (int i = 0; i < height - 2; i++)
                {

                    //left pixels1
                    pixels1[0] += (dataPtr2 - nChan2 - widthStep2)[0];
                    pixels1[1] += (dataPtr2 - nChan2 - widthStep2)[1];
                    pixels1[2] += (dataPtr2 - nChan2 - widthStep2)[2];
                    pixels1[0] += 2 * (dataPtr2 - nChan2)[0];
                    pixels1[1] += 2 * (dataPtr2 - nChan2)[1];
                    pixels1[2] += 2 * (dataPtr2 - nChan2)[2];
                    pixels1[0] += (dataPtr2 + widthStep2 - nChan2)[0];
                    pixels1[1] += (dataPtr2 + widthStep2 - nChan2)[1];
                    pixels1[2] += (dataPtr2 + widthStep2 - nChan2)[2];
                    //right pixels1
                    pixels1[0] = pixels1[0] - (dataPtr2 - widthStep2)[0];
                    pixels1[1] = pixels1[1] - (dataPtr2 - widthStep2)[1];
                    pixels1[2] = pixels1[2] - (dataPtr2 - widthStep2)[2];
                    pixels1[0] = pixels1[0] - 2 * (dataPtr2)[0];
                    pixels1[1] = pixels1[1] - 2 * (dataPtr2)[1];
                    pixels1[2] = pixels1[2] - 2 * (dataPtr2)[2];
                    pixels1[0] = pixels1[0] - (dataPtr2 + widthStep2)[0];
                    pixels1[1] = pixels1[1] - (dataPtr2 + widthStep2)[1];
                    pixels1[2] = pixels1[2] - (dataPtr2 + widthStep2)[2];

                    //bottom pixels2
                    pixels2[0] += (dataPtr2 + widthStep - nChan2)[0];
                    pixels2[1] += (dataPtr2 + widthStep - nChan2)[1];
                    pixels2[2] += (dataPtr2 + widthStep - nChan2)[2];
                    pixels2[0] += 3 * (dataPtr2 + widthStep)[0];
                    pixels2[1] += 3 * (dataPtr2 + widthStep)[1];
                    pixels2[2] += 3 * (dataPtr2 + widthStep)[2];
                    //top pixels2
                    pixels2[0] = pixels2[0] - (dataPtr2 - nChan2 - widthStep)[0];
                    pixels2[1] = pixels2[1] - (dataPtr2 - nChan2 - widthStep)[1];
                    pixels2[2] = pixels2[2] - (dataPtr2 - nChan2 - widthStep)[2];
                    pixels2[0] = pixels2[0] - 3 * (dataPtr2 - widthStep)[0];
                    pixels2[1] = pixels2[1] - 3 * (dataPtr2 - widthStep)[1];
                    pixels2[2] = pixels2[2] - 3 * (dataPtr2 - widthStep)[2];

                    s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                    s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                    s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                    //check
                    if (s[0] > 255)
                        s[0] = 255;
                    if (s[1] > 255)
                        s[1] = 255;
                    if (s[2] > 255)
                        s[2] = 255;
                    if (s[0] < 0)
                        s[0] = 0;
                    if (s[1] < 0)
                        s[1] = 0;
                    if (s[2] < 0)
                        s[2] = 0;

                    dataPtr[0] = Convert.ToByte(s[0]);
                    dataPtr[1] = Convert.ToByte(s[1]);
                    dataPtr[2] = Convert.ToByte(s[2]);

                    s[0] = 0;
                    s[1] = 0;
                    s[2] = 0;

                    pixels1[0] = 0;
                    pixels1[1] = 0;
                    pixels1[2] = 0;

                    pixels2[0] = 0;
                    pixels2[1] = 0;
                    pixels2[2] = 0;

                    dataPtr += widthStep;
                    dataPtr2 += widthStep2;

                }

                //right bottom corrner

                //left pixels1
                pixels1[0] += (dataPtr2 - nChan2 - widthStep2)[0];
                pixels1[1] += (dataPtr2 - nChan2 - widthStep2)[1];
                pixels1[2] += (dataPtr2 - nChan2 - widthStep2)[2];
                pixels1[0] += 3 * (dataPtr2)[0];
                pixels1[1] += 3 * (dataPtr2)[1];
                pixels1[2] += 3 * (dataPtr2)[2];
                //right pixels1
                pixels1[0] = pixels1[0] - (dataPtr2 - widthStep)[0];
                pixels1[1] = pixels1[1] - (dataPtr2 - widthStep)[1];
                pixels1[2] = pixels1[2] - (dataPtr2 - widthStep)[2];
                pixels1[0] = pixels1[0] - 3 * (dataPtr2)[0];
                pixels1[1] = pixels1[1] - 3 * (dataPtr2)[1];
                pixels1[2] = pixels1[2] - 3 * (dataPtr2)[2];
                //bottom pixels2
                pixels2[0] += (dataPtr2 - nChan2)[0];
                pixels2[1] += (dataPtr2 - nChan2)[1];
                pixels2[2] += (dataPtr2 - nChan2)[2];
                pixels2[0] += 3 * (dataPtr2)[0];
                pixels2[1] += 3 * (dataPtr2)[1];
                pixels2[2] += 3 * (dataPtr2)[2];
                //top pixels2
                pixels2[0] = pixels2[0] - (dataPtr2 - nChan2 - widthStep)[0];
                pixels2[1] = pixels2[1] - (dataPtr2 - nChan2 - widthStep)[1];
                pixels2[2] = pixels2[2] - (dataPtr2 - nChan2 - widthStep)[2];
                pixels2[0] = pixels2[0] - 3 * (dataPtr2 - widthStep)[0];
                pixels2[1] = pixels2[1] - 3 * (dataPtr2 - widthStep)[1];
                pixels2[2] = pixels2[2] - 3 * (dataPtr2 - widthStep)[2];

                s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                //check
                if (s[0] > 255)
                    s[0] = 255;
                if (s[1] > 255)
                    s[1] = 255;
                if (s[2] > 255)
                    s[2] = 255;
                if (s[0] < 0)
                    s[0] = 0;
                if (s[1] < 0)
                    s[1] = 0;
                if (s[2] < 0)
                    s[2] = 0;

                dataPtr[0] = Convert.ToByte(s[0]);
                dataPtr[1] = Convert.ToByte(s[1]);
                dataPtr[2] = Convert.ToByte(s[2]);

                s[0] = 0;
                s[1] = 0;
                s[2] = 0;

                pixels1[0] = 0;
                pixels1[1] = 0;
                pixels1[2] = 0;

                pixels2[0] = 0;
                pixels2[1] = 0;
                pixels2[2] = 0;

                dataPtr -= nChan;
                dataPtr2 -= nChan2;

                //bottom frame

                for (int i = 0; i < width - 2; i++)
                {
                    //left pixels1
                    pixels1[0] += 3 * (dataPtr2 - nChan2)[0];
                    pixels1[1] += 3 * (dataPtr2 - nChan2)[1];
                    pixels1[2] += 3 * (dataPtr2 - nChan2)[2];
                    pixels1[0] += (dataPtr2 - widthStep - nChan2)[0];
                    pixels1[1] += (dataPtr2 - widthStep - nChan2)[1];
                    pixels1[2] += (dataPtr2 - widthStep - nChan2)[2];

                    //right pixels1
                    pixels1[0] = pixels1[0] - 3 * (dataPtr2 + nChan2)[0];
                    pixels1[1] = pixels1[1] - 3 * (dataPtr2 + nChan2)[1];
                    pixels1[2] = pixels1[2] - 3 * (dataPtr2 + nChan2)[2];
                    pixels1[0] = pixels1[0] - (dataPtr2 - widthStep + nChan2)[0];
                    pixels1[1] = pixels1[1] - (dataPtr2 - widthStep + nChan2)[1];
                    pixels1[2] = pixels1[2] - (dataPtr2 - widthStep + nChan2)[2];

                    //bottom pixels2
                    pixels2[0] += (dataPtr2 - nChan)[0];
                    pixels2[1] += (dataPtr2 - nChan)[1];
                    pixels2[2] += (dataPtr2 - nChan)[2];
                    pixels2[0] += 2 * (dataPtr2)[0];
                    pixels2[1] += 2 * (dataPtr2)[1];
                    pixels2[2] += 2 * (dataPtr2)[2];
                    pixels2[0] += (dataPtr2 + nChan)[0];
                    pixels2[1] += (dataPtr2 + nChan)[1];
                    pixels2[2] += (dataPtr2 + nChan)[2];
                    //top pixels2
                    pixels2[0] = pixels2[0] - (dataPtr2 - widthStep2 - nChan)[0];
                    pixels2[1] = pixels2[1] - (dataPtr2 - widthStep2 - nChan)[1];
                    pixels2[2] = pixels2[2] - (dataPtr2 - widthStep2 - nChan)[2];
                    pixels2[0] = pixels2[0] - 2 * (dataPtr2 - widthStep2)[0];
                    pixels2[1] = pixels2[1] - 2 * (dataPtr2 - widthStep2)[1];
                    pixels2[2] = pixels2[2] - 2 * (dataPtr2 - widthStep2)[2];
                    pixels2[0] = pixels2[0] - (dataPtr2 + nChan - widthStep2)[0];
                    pixels2[1] = pixels2[1] - (dataPtr2 + nChan - widthStep2)[1];
                    pixels2[2] = pixels2[2] - (dataPtr2 + nChan - widthStep2)[2];

                    s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                    s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                    s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                    //check
                    if (s[0] > 255)
                        s[0] = 255;
                    if (s[1] > 255)
                        s[1] = 255;
                    if (s[2] > 255)
                        s[2] = 255;
                    if (s[0] < 0)
                        s[0] = 0;
                    if (s[1] < 0)
                        s[1] = 0;
                    if (s[2] < 0)
                        s[2] = 0;

                    dataPtr[0] = Convert.ToByte(s[0]);
                    dataPtr[1] = Convert.ToByte(s[1]);
                    dataPtr[2] = Convert.ToByte(s[2]);

                    s[0] = 0;
                    s[1] = 0;
                    s[2] = 0;

                    pixels1[0] = 0;
                    pixels1[1] = 0;
                    pixels1[2] = 0;

                    pixels2[0] = 0;
                    pixels2[1] = 0;
                    pixels2[2] = 0;

                    dataPtr -= nChan;
                    dataPtr2 -= nChan2;

                }
                //left bottom corrner

                //left pixels1
                pixels1[0] += 3 * (dataPtr2)[0];
                pixels1[1] += 3 * (dataPtr2)[1];
                pixels1[2] += 3 * (dataPtr2)[2];
                pixels1[0] += (dataPtr2 - widthStep2)[0];
                pixels1[1] += (dataPtr2 - widthStep2)[1];
                pixels1[2] += (dataPtr2 - widthStep2)[2];
                //right pixels1
                pixels1[0] = pixels1[0] - (dataPtr2 - widthStep + nChan2)[0];
                pixels1[1] = pixels1[1] - (dataPtr2 - widthStep + nChan2)[1];
                pixels1[2] = pixels1[2] - (dataPtr2 - widthStep + nChan2)[2];
                pixels1[0] = pixels1[0] - 3 * (dataPtr2 + nChan2)[0];
                pixels1[1] = pixels1[1] - 3 * (dataPtr2 + nChan2)[1];
                pixels1[2] = pixels1[2] - 3 * (dataPtr2 + nChan2)[2];
                //bottom pixels2
                pixels2[0] += (dataPtr2 + nChan2)[0];
                pixels2[1] += (dataPtr2 + nChan2)[1];
                pixels2[2] += (dataPtr2 + nChan2)[2];
                pixels2[0] += 3 * (dataPtr2)[0];
                pixels2[1] += 3 * (dataPtr2)[1];
                pixels2[2] += 3 * (dataPtr2)[2];
                //top pixels2
                pixels2[0] = pixels2[0] - (dataPtr2 + nChan2 - widthStep)[0];
                pixels2[1] = pixels2[1] - (dataPtr2 + nChan2 - widthStep)[1];
                pixels2[2] = pixels2[2] - (dataPtr2 + nChan2 - widthStep)[2];
                pixels2[0] = pixels2[0] - 3 * (dataPtr2 - widthStep)[0];
                pixels2[1] = pixels2[1] - 3 * (dataPtr2 - widthStep)[1];
                pixels2[2] = pixels2[2] - 3 * (dataPtr2 - widthStep)[2];

                s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                //check
                if (s[0] > 255)
                    s[0] = 255;
                if (s[1] > 255)
                    s[1] = 255;
                if (s[2] > 255)
                    s[2] = 255;
                if (s[0] < 0)
                    s[0] = 0;
                if (s[1] < 0)
                    s[1] = 0;
                if (s[2] < 0)
                    s[2] = 0;

                dataPtr[0] = Convert.ToByte(s[0]);
                dataPtr[1] = Convert.ToByte(s[1]);
                dataPtr[2] = Convert.ToByte(s[2]);

                s[0] = 0;
                s[1] = 0;
                s[2] = 0;

                pixels1[0] = 0;
                pixels1[1] = 0;
                pixels1[2] = 0;

                pixels2[0] = 0;
                pixels2[1] = 0;
                pixels2[2] = 0;

                //left frame

                dataPtr -= widthStep;
                dataPtr2 -= widthStep;

                for (int i = 0; i < height - 2; i++)
                {

                    //left pixels1
                    pixels1[0] += (dataPtr2 - widthStep2)[0];
                    pixels1[1] += (dataPtr2 - widthStep2)[1];
                    pixels1[2] += (dataPtr2 - widthStep2)[2];
                    pixels1[0] += 2 * (dataPtr2)[0];
                    pixels1[1] += 2 * (dataPtr2)[1];
                    pixels1[2] += 2 * (dataPtr2)[2];
                    pixels1[0] += (dataPtr2 + widthStep2)[0];
                    pixels1[1] += (dataPtr2 + widthStep2)[1];
                    pixels1[2] += (dataPtr2 + widthStep2)[2];
                    //right pixels1
                    pixels1[0] = pixels1[0] - (dataPtr2 - widthStep2 + nChan2)[0];
                    pixels1[1] = pixels1[1] - (dataPtr2 - widthStep2 + nChan2)[1];
                    pixels1[2] = pixels1[2] - (dataPtr2 - widthStep2 + nChan2)[2];
                    pixels1[0] = pixels1[0] - 2 * (dataPtr2 + nChan2)[0];
                    pixels1[1] = pixels1[1] - 2 * (dataPtr2 + nChan2)[1];
                    pixels1[2] = pixels1[2] - 2 * (dataPtr2 + nChan2)[2];
                    pixels1[0] = pixels1[0] - (dataPtr2 + widthStep2 + nChan2)[0];
                    pixels1[1] = pixels1[1] - (dataPtr2 + widthStep2 + nChan2)[1];
                    pixels1[2] = pixels1[2] - (dataPtr2 + widthStep2 + nChan2)[2];

                    //bottom pixels2
                    pixels2[0] += (dataPtr2 + widthStep + nChan2)[0];
                    pixels2[1] += (dataPtr2 + widthStep + nChan2)[1];
                    pixels2[2] += (dataPtr2 + widthStep + nChan2)[2];
                    pixels2[0] += 3 * (dataPtr2 + widthStep)[0];
                    pixels2[1] += 3 * (dataPtr2 + widthStep)[1];
                    pixels2[2] += 3 * (dataPtr2 + widthStep)[2];
                    //top pixels2
                    pixels2[0] = pixels2[0] - (dataPtr2 + nChan2 - widthStep)[0];
                    pixels2[1] = pixels2[1] - (dataPtr2 + nChan2 - widthStep)[1];
                    pixels2[2] = pixels2[2] - (dataPtr2 + nChan2 - widthStep)[2];
                    pixels2[0] = pixels2[0] - 3 * (dataPtr2 - widthStep)[0];
                    pixels2[1] = pixels2[1] - 3 * (dataPtr2 - widthStep)[1];
                    pixels2[2] = pixels2[2] - 3 * (dataPtr2 - widthStep)[2];

                    s[0] = Math.Abs(pixels1[0]) + Math.Abs(pixels2[0]);
                    s[1] = Math.Abs(pixels1[1]) + Math.Abs(pixels2[1]);
                    s[2] = Math.Abs(pixels1[2]) + Math.Abs(pixels2[2]);

                    //check
                    if (s[0] > 255)
                        s[0] = 255;
                    if (s[1] > 255)
                        s[1] = 255;
                    if (s[2] > 255)
                        s[2] = 255;
                    if (s[0] < 0)
                        s[0] = 0;
                    if (s[1] < 0)
                        s[1] = 0;
                    if (s[2] < 0)
                        s[2] = 0;

                    dataPtr[0] = Convert.ToByte(s[0]);
                    dataPtr[1] = Convert.ToByte(s[1]);
                    dataPtr[2] = Convert.ToByte(s[2]);

                    s[0] = 0;
                    s[1] = 0;
                    s[2] = 0;

                    pixels1[0] = 0;
                    pixels1[1] = 0;
                    pixels1[2] = 0;

                    pixels2[0] = 0;
                    pixels2[1] = 0;
                    pixels2[2] = 0;

                    dataPtr -= widthStep;
                    dataPtr2 -= widthStep2;

                }

            }
        }
Esempio n. 11
0
        internal static void Scale(Image<Bgr, byte> img, double scale)
        {
            unsafe
            {
                //new copy
                Image<Bgr, Byte> imgcopy = img.Copy();
                MIplImage m2 = imgcopy.MIplImage;
                byte* dataPtr2 = (byte*)m2.imageData.ToPointer();
                int nChan2 = m2.nChannels;
                int padding2 = m2.widthStep - m2.nChannels * m2.width;
                // get the pointer to the beginning of the image
                MIplImage m = img.MIplImage;
                byte* dataPtr = (byte*)m.imageData.ToPointer();
                int width = img.Width;
                int height = img.Height;
                int nChan = m.nChannels; // numero de canais 3
                int padding = m.widthStep - m.nChannels * m.width; // alinhamento (padding)

                byte* dataPtrpom = dataPtr;

                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        dataPtr[0] = 0;
                        dataPtr[1] = 0;
                        dataPtr[2] = 0;
                        dataPtr += nChan;
                    }
                    dataPtr += padding;
                }

                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {

                        int newx = Convert.ToInt16(x*scale);
                        int newy = Convert.ToInt16(y*scale);

                        dataPtr = dataPtrpom;
                        if (newx < width & newy < height)
                        {
                            for (int i = 0; i < newy; i++)
                            {
                                dataPtr += nChan * width;
                                dataPtr += padding;
                            }
                            dataPtr += nChan * newx;

                            dataPtr[0] = dataPtr2[0];
                            dataPtr[1] = dataPtr2[1];
                            dataPtr[2] = dataPtr2[2];
                        }
                        dataPtr2 += nChan2;
                    }
                    dataPtr2 += padding2;
                }
            }
        }
Esempio n. 12
0
        internal static void Roberts(Image<Bgr, byte> img)
        {
            unsafe
            {
                //new copy
                Image<Bgr, Byte> imgcopy = img.Copy();
                MIplImage m2 = imgcopy.MIplImage;
                byte* dataPtr2 = (byte*)m2.imageData.ToPointer();
                int nChan2 = m2.nChannels;
                int padding2 = m2.widthStep - m2.nChannels * m2.width;
                // get the pointer to the beginning of the image
                MIplImage m = img.MIplImage;
                byte* dataPtr = (byte*)m.imageData.ToPointer();
                int width = img.Width;
                int height = img.Height;
                int nChan = m.nChannels; // numero de canais 3
                int padding = m.widthStep - m.nChannels * m.width; // alinhamento (padding)
                int widthStep = m.widthStep;
                int widthStep2 = m2.widthStep;
                int width2 = imgcopy.Width;
                int height2 = imgcopy.Height;

                byte* dataPtrpom = dataPtr;
                byte* dataPtrpom2 = dataPtr2;

                int[] pixels = new int[3];

                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 0;

                //centre
                dataPtr += widthStep;
                dataPtr2 += widthStep2;

                for (int y = 1; y < height - 1; y++)
                {
                    for (int x = 0; x < width - 1; x++)
                    {
                        pixels[0] += Math.Abs(dataPtr2[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 + nChan2)[0]);
                        pixels[1] += Math.Abs(dataPtr2[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2)[1] - (dataPtr2 + nChan2)[1]);
                        pixels[2] += Math.Abs(dataPtr2[2] - (dataPtr2 + widthStep2 + nChan2)[2]) + Math.Abs((dataPtr2 + widthStep2)[2] - (dataPtr2 + nChan2)[2]);

                        if (pixels[0] > 255)
                            pixels[0] = 255;
                        if (pixels[1] > 255)
                            pixels[1] = 255;
                        if (pixels[2] > 255)
                            pixels[2] = 255;
                        if (pixels[0] < 0)
                            pixels[0] = 0;
                        if (pixels[1] < 0)
                            pixels[1] = 0;
                        if (pixels[2] < 0)
                            pixels[2] = 0;
                        dataPtr[0] = Convert.ToByte(pixels[0]);
                        dataPtr[1] = Convert.ToByte(pixels[1]);
                        dataPtr[2] = Convert.ToByte(pixels[2]);
                        pixels[0] = 0;
                        pixels[1] = 0;
                        pixels[2] = 0;
                        dataPtr += nChan;
                        dataPtr2 += nChan2;
                    }
                    dataPtr += nChan + padding;
                    dataPtr2 += nChan2 + padding2;
                }

                //top
                dataPtr = dataPtrpom;
                dataPtr2 = dataPtrpom2;

                for (int x = 0; x < width2 - 1; x++)
                {
                    pixels[0] += Math.Abs(dataPtr2[0] - (dataPtr2 + widthStep2 + nChan2)[0]) + Math.Abs((dataPtr2 + widthStep2)[0] - (dataPtr2 + nChan2)[0]);
                    pixels[1] += Math.Abs(dataPtr2[1] - (dataPtr2 + widthStep2 + nChan2)[1]) + Math.Abs((dataPtr2 + widthStep2)[1] - (dataPtr2 + nChan2)[1]);
                    pixels[2] += Math.Abs(dataPtr2[2] - (dataPtr2 + widthStep2 + nChan2)[2]) + Math.Abs((dataPtr2 + widthStep2)[2] - (dataPtr2 + nChan2)[2]);

                    if (pixels[0] > 255)
                        pixels[0] = 255;
                    if (pixels[1] > 255)
                        pixels[1] = 255;
                    if (pixels[2] > 255)
                        pixels[2] = 255;
                    if (pixels[0] < 0)
                        pixels[0] = 0;
                    if (pixels[1] < 0)
                        pixels[1] = 0;
                    if (pixels[2] < 0)
                        pixels[2] = 0;
                    dataPtr[0] = Convert.ToByte(pixels[0]);
                    dataPtr[1] = Convert.ToByte(pixels[1]);
                    dataPtr[2] = Convert.ToByte(pixels[2]);
                    pixels[0] = 0;
                    pixels[1] = 0;
                    pixels[2] = 0;

                    dataPtr += nChan;
                    dataPtr2 += nChan2;
                }
                //right
                for (int y = 0; y < height2 - 1; y++)
                {
                    pixels[0] += Math.Abs(dataPtr2[0] - (dataPtr2 + widthStep2)[0] + Math.Abs((dataPtr2 + widthStep2)[0] - dataPtr2[0]));
                    pixels[1] += Math.Abs(dataPtr2[1] - (dataPtr2 + widthStep2)[1] + Math.Abs((dataPtr2 + widthStep2)[1] - dataPtr2[1]));
                    pixels[2] += Math.Abs(dataPtr2[2] - (dataPtr2 + widthStep2)[2] + Math.Abs((dataPtr2 + widthStep2)[2] - dataPtr2[2]));

                    if (pixels[0] > 255)
                        pixels[0] = 255;
                    if (pixels[1] > 255)
                        pixels[1] = 255;
                    if (pixels[2] > 255)
                        pixels[2] = 255;
                    if (pixels[0] < 0)
                        pixels[0] = 0;
                    if (pixels[1] < 0)
                        pixels[1] = 0;
                    if (pixels[2] < 0)
                        pixels[2] = 0;
                    dataPtr[0] = Convert.ToByte(pixels[0]);
                    dataPtr[1] = Convert.ToByte(pixels[1]);
                    dataPtr[2] = Convert.ToByte(pixels[2]);
                    pixels[0] = 0;
                    pixels[1] = 0;
                    pixels[2] = 0;

                    dataPtr += widthStep;
                    dataPtr2 += widthStep2;
                }
                //bottom right corner
                dataPtr[0] = 0;
                dataPtr[1] = 0;
                dataPtr[2] = 0;
                //bottom
                dataPtr -= nChan;
                dataPtr2 -= nChan2;
                for(int x = 0; x < width2 - 1; x++)
                {
                    pixels[0] += Math.Abs(dataPtr2[0] - (dataPtr2 + nChan2)[0])*2;
                    pixels[1] += Math.Abs(dataPtr2[1] - (dataPtr2 + nChan2)[1])*2;
                    pixels[2] += Math.Abs(dataPtr2[2] - (dataPtr2 + nChan2)[2])*2;

                    if (pixels[0] > 255)
                        pixels[0] = 255;
                    if (pixels[1] > 255)
                        pixels[1] = 255;
                    if (pixels[2] > 255)
                        pixels[2] = 255;
                    if (pixels[0] < 0)
                        pixels[0] = 0;
                    if (pixels[1] < 0)
                        pixels[1] = 0;
                    if (pixels[2] < 0)
                        pixels[2] = 0;
                    dataPtr[0] = Convert.ToByte(pixels[0]);
                    dataPtr[1] = Convert.ToByte(pixels[1]);
                    dataPtr[2] = Convert.ToByte(pixels[2]);
                    pixels[0] = 0;
                    pixels[1] = 0;
                    pixels[2] = 0;

                    dataPtr -= nChan;
                    dataPtr2 -= nChan2;
                }
                //left bottom corner
                pixels[0] += Math.Abs(dataPtr2[0] - (dataPtr2 + nChan2)[0]) * 2;
                pixels[1] += Math.Abs(dataPtr2[1] - (dataPtr2 + nChan2)[1]) * 2;
                pixels[2] += Math.Abs(dataPtr2[2] - (dataPtr2 + nChan2)[2]) * 2;

                if (pixels[0] > 255)
                    pixels[0] = 255;
                if (pixels[1] > 255)
                    pixels[1] = 255;
                if (pixels[2] > 255)
                    pixels[2] = 255;
                if (pixels[0] < 0)
                    pixels[0] = 0;
                if (pixels[1] < 0)
                    pixels[1] = 0;
                if (pixels[2] < 0)
                    pixels[2] = 0;
                dataPtr[0] = Convert.ToByte(pixels[0]);
                dataPtr[1] = Convert.ToByte(pixels[1]);
                dataPtr[2] = Convert.ToByte(pixels[2]);
            }
        }
Esempio n. 13
0
 // Konstruktor
 public Enhancement(Image<Bgr, Byte> image)
 {
     imageInput = image.Copy();
     //imageTrafficsigns = imageBgr.Copy();
     imageEnhanced = new Image<Bgr, Byte>(imageInput.Width, imageInput.Height);
 }