используя медианный фильтр 3x3 в c # - PullRequest
0 голосов
/ 02 марта 2011

Здравствуйте, друзья, я пытаюсь применить медианный фильтр 3x3 к изображению отпечатка пальца appxo 500x500.Я использую указатели для доступа к данным изображения.Но я действительно не могу понять, как это сделать.Я очень хорошо знаю эту концепцию, но если вы поможете мне в коде, это будет очень полезно.Я искал в сети, но я не получаю никакой помощи.спасибо

public void medianfilter(Bitmap image)
{ 
    Byte[,] rtemp = new Byte[3, 3];
    Byte[,] gtemp = new Byte[3, 3]; 
    Byte[,] btemp = new Byte[3, 3]; 
    BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
    int stride = data.Stride; 
    unsafe {
           byte* imgPtr = (byte*)(void*)(data.Scan0);
           int nOffset = stride - image.Width * 3;
           for (int i = 0; i < image.Width; i++)
           { 
               for (int j = 0; j < image.Height; j++)
               { 
                   for (int x = i; x < 3 + i; x++)
                   {
                       for (int y = j; y < 3 + j; y++) {
                           rtemp[x, y] = imgPtr[0];
                           gtemp[x, y] = imgPtr[1];
                           btemp[x, y] = imgPtr[2];
                           imgPtr += 3; } } imgPtr += nOffset;
                    }
               }
           }
     }

1 Ответ

2 голосов
/ 11 марта 2011

Прежде всего, вы вообще не изменяете растровое изображение!

Вам необходимо разыменовать указатель перед тем, как применить изменение, а затем вы должны разблокировать растровое изображение ...

что я имел в моем старом курсе компьютерной графики.Измените его по мере необходимости.

unsafe
{
    //Go to first pixel, the cast is important
    byte* p = (byte*)imageData.Scan0.ToPointer();

    //For each line
    for (int y = 0; y < bmp.Height; y++)
    {
         //For each pixel (bmp.Width * 3) because jpg has R, G, and B value if the bitmap has an alpha do a *4 multiplier
         for (int x = 0; x < bmp.Width * 3; x++)
         {
                //Invert from the original image
                *p = (byte)(255 - *p);
                //Go to next pointer
                p++;
          }
          //Move pointer to the right end of the line and then go down to a new line
          //Skip the unused space
          p += offset;
     }
}
bmp.UnlockBits(imageData);
bmp.Save(path);

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...