2012-04-21 2 views
1

Мне нужна помощь, чтобы извлечь указанный цвет (например, красный) из изображения, а затем обрезать объекты, которые содержат этот цвет.Как я могу использовать код в C# для выделения цвета?

Эта часть настолько важна в моем проекте выпускников, который отслеживает лазерный жест на экране проектора.

+2

Когда вы говорите, кадрирование, вы имеете в виду ...? Вы хотите удалить красную рамку? Вы хотите сделать все красное изображение белым/прозрачным/etc? – SimpleVar

+0

Я имею в виду отсечение объекта с указанным цветом – user2012

+0

например, красный шар в воображении – user2012

ответ

1

Я действительно не уверен, что правильно вас понял, но вот код, который делает только красные части изображения видимыми.

Вы можете изменить его только на красные части, невидимые, изменив> на < по сравнению с 200. Вы также можете сыграть с номером 200, чтобы узнать, какой порог хорош для вашей красной проверки.

private static unsafe void OnlyRed(Bitmap bitmap, Color replacement) 
{ 
    var redOffset = 0; 
    var bpp = 32; 
    var bytesRep = new List<byte> {replacement.R, replacement.G, replacement.B}; 

    switch (bitmap.PixelFormat) 
    { 
     case PixelFormat.Format24bppRgb: 
      bpp = 24; 
      break; 
     case PixelFormat.Format32bppArgb: 
      redOffset = 8; 
      bytesRep.Insert(0, replacement.A); 
      break; 
     case PixelFormat.Format32bppRgb: 
     case PixelFormat.Canonical: 
      bytesRep.Add(replacement.A); 
      break; 
     default: 
      throw new NotSupportedException("Pixel format unsupported."); 
    } 

    var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
           ImageLockMode.ReadWrite, 
           bitmap.PixelFormat); 

    var start = (byte*)data.Scan0; 
    var end = start + data.Height * data.Stride; 

    for (var curr = start; curr < end; curr += bpp/8) 
    { 
     if (curr[redOffset] > 200) 
     { 
      continue; 
     } 

     for (var i = 0; i < bytesRep.Count; i++) 
     { 
      curr[i] = bytesRep[i]; 
     } 
    } 

    bitmap.UnlockBits(data); 
} 

Использование:

var bitmap = new Bitmap("file location..."); 
OnlyRed(bitmap, Color.Transparent); 
+0

доза не работает со мной – user2012

+0

Что не работает, точно? Вы получаете исключение? Является ли результат неправильным? Как? – SimpleVar

+0

У меня есть изображение http://www.mediafire.com/imageview.php?quickkey=ey2r55xu331gbtl Мне нужен код на C#, который узнает черный прямоугольник в изображении, затем закрепите область в ее сторону. – user2012

Смежные вопросы