Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static void Roberts(Image<Bgr, byte> img, Image<Bgr, byte> imgCopy)
- {
- unsafe
- {
- // direct access to the image memory(sequencial)
- // direcion top left -> bottom right
- MIplImage m = img.MIplImage;
- byte* dataPtr = (byte*)m.imageData.ToPointer(); // Pointer to the image
- MIplImage m1 = imgCopy.MIplImage;
- byte* dataPtr1 = (byte*)m1.imageData.ToPointer(); // Pointer to the image
- double blueD = 0, greenD = 0, redD = 0;
- int width = img.Width;
- int height = img.Height;
- int nChan = m.nChannels; // number of channels - 3
- int widthS = m.widthStep;
- int padding = m.widthStep - m.nChannels * m.width; // alinhament bytes (padding)
- int x, y, e, f, h,i;
- if (nChan == 3) // image in RGB
- {
- for (y = 0; y < height; y++) //percorrer a imagem pixel a pixel
- {
- for (x = 0; x < width; x++)
- {
- //Core
- if (x != 0 && x != (width - 1) && y != 0 && y != (height - 1))
- {
- e = dataPtr1[0];
- f = (dataPtr1 + nChan)[0];
- h = (dataPtr1 + widthS)[0];
- i = (dataPtr1 + nChan + widthS)[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = (dataPtr1 + nChan)[1];
- h = (dataPtr1 + widthS)[1];
- i = (dataPtr1 + nChan + widthS)[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = (dataPtr1 + nChan)[2];
- h = (dataPtr1 + widthS)[2];
- i = (dataPtr1 + nChan + widthS)[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- else
- {
- //Top Bar
- if (x != 0 && x != (width - 1) && y == 0)
- {
- e = dataPtr1[0];
- f = (dataPtr1 + nChan)[0];
- h = (dataPtr1 + widthS)[0];
- i = (dataPtr1 + nChan + widthS)[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = (dataPtr1 + nChan)[1];
- h = (dataPtr1 + widthS)[1];
- i = (dataPtr1 + nChan + widthS)[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = (dataPtr1 + nChan)[2];
- h = (dataPtr1 + widthS)[2];
- i = (dataPtr1 + nChan + widthS)[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- else
- {
- //Bottam Bar
- if (x != 0 && x != (width - 1) && y == (height - 1))
- {
- e = dataPtr1[0];
- f = (dataPtr1 + nChan)[0];
- h = dataPtr1[0];
- i = (dataPtr1 + nChan)[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = (dataPtr1 + nChan)[1];
- h = dataPtr1[1];
- i = (dataPtr1 + nChan)[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = (dataPtr1 + nChan)[2];
- h = dataPtr1[2];
- i = (dataPtr1 + nChan)[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- else
- {
- //Left Colum
- if (x == 0 && y != 0 && y != (height - 1))
- {
- e = dataPtr1[0];
- f = (dataPtr1 + nChan)[0];
- h = (dataPtr1 + widthS)[0];
- i = (dataPtr1 + nChan + widthS)[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = (dataPtr1 + nChan)[1];
- h = (dataPtr1 + widthS)[1];
- i = (dataPtr1 + nChan + widthS)[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = (dataPtr1 + nChan)[2];
- h = (dataPtr1 + widthS)[2];
- i = (dataPtr1 + nChan + widthS)[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- else
- {
- //Right Colum
- if (x == (width - 1) && y != 0 && y != (height - 1))
- {
- e = dataPtr1[0];
- f = dataPtr1[0];
- h = (dataPtr1 + widthS)[0];
- i = (dataPtr1 + widthS)[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = dataPtr1[1];
- h = (dataPtr1 + widthS)[1];
- i = (dataPtr1 + widthS)[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = dataPtr1[2];
- h = (dataPtr1 + widthS)[2];
- i = (dataPtr1 + widthS)[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- else
- {
- //Top Left
- if (x == 0 && y == 0)
- {
- e = dataPtr1[0];
- f = (dataPtr1 + nChan)[0];
- h = (dataPtr1 + widthS)[0];
- i = (dataPtr1 + nChan + widthS)[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = (dataPtr1 + nChan)[1];
- h = (dataPtr1 + widthS)[1];
- i = (dataPtr1 + nChan + widthS)[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = (dataPtr1 + nChan)[2];
- h = (dataPtr1 + widthS)[2];
- i = (dataPtr1 + nChan + widthS)[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- else
- {
- //Top Right
- if (x == (width - 1) && y == 0)
- {
- e = dataPtr1[0];
- f = dataPtr1[0];
- h = (dataPtr1 + widthS)[0];
- i = (dataPtr1 + widthS)[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = dataPtr1[1];
- h = (dataPtr1 + widthS)[1];
- i = (dataPtr1 + widthS)[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = dataPtr1[2];
- h = (dataPtr1 + widthS)[2];
- i = (dataPtr1 + widthS)[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- else
- {
- //Bottom Left
- if (x == 0 && y == (height - 1))
- {
- e = dataPtr1[0];
- f = (dataPtr1 + nChan)[0];
- h = dataPtr1[0];
- i = (dataPtr1 + nChan)[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = (dataPtr1 + nChan)[1];
- h = dataPtr1[1];
- i = (dataPtr1 + nChan)[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = (dataPtr1 + nChan)[2];
- h = dataPtr1[2];
- i = (dataPtr1 + nChan)[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- else
- {
- //Bottam Right
- if (x == (width - 1) && y == (height - 1))
- {
- e = dataPtr1[0];
- f = dataPtr1[0];
- h = dataPtr1[0];
- i = dataPtr1[0];
- blueD = Math.Abs(e - i) + Math.Abs(f - h);
- if (blueD > 255)
- blueD = 255;
- e = dataPtr1[1];
- f = dataPtr1[1];
- h = dataPtr1[1];
- i = dataPtr1[1];
- greenD = Math.Abs(e - i) + Math.Abs(f - h);
- if (greenD > 255)
- greenD = 255;
- e = dataPtr1[2];
- f = dataPtr1[2];
- h = dataPtr1[2];
- i = dataPtr1[2];
- redD = Math.Abs(e - i) + Math.Abs(f - h);
- if (redD > 255)
- redD = 255;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- dataPtr[0] = (byte)Math.Round(blueD);
- dataPtr[1] = (byte)Math.Round(greenD);
- dataPtr[2] = (byte)Math.Round(redD);
- // advance the pointer to the next pixel
- dataPtr += nChan;
- dataPtr1 += nChan;
- }
- //at the end of the line advance the pointer by the aligment bytes (padding)
- dataPtr += padding;
- dataPtr1 += padding;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement